From a0aef66414ad7d6d7e28d0ac3498dc3b34398206 Mon Sep 17 00:00:00 2001 From: Joe Constantino Date: Wed, 19 Aug 2026 10:24:13 -0700 Subject: [PATCH] template integration --- .agents/plugins/marketplace.json | 20 + .gitignore | 4 + README.md | 12 +- .../2026-08-18-tableau-plugin-resources.md | 1033 + ...6-08-18-tableau-plugin-resources-design.md | 222 + plugins/tableau/.codex-plugin/plugin.json | 6 +- plugins/tableau/README.md | 55 + .../tableau/resources/catalog-overrides.json | 23 + plugins/tableau/resources/catalog.json | 9514 ++++++ .../resources/examples/calculated-field.json | 36 + .../examples/column-instance-naming.json | 71 + .../resources/examples/dashboard-tiled.json | 79 + .../examples/dashboard-validation-grid.json | 93 + .../tableau/resources/examples/dual-axis.json | 61 + .../examples/encoding-pane-level.json | 32 + .../examples/filter-categorical.json | 37 + .../examples/filter-relative-date.json | 82 + .../tableau/resources/examples/lod-fixed.json | 47 + .../resources/examples/mark-encoding.json | 44 + .../tableau/resources/examples/parameter.json | 78 + .../resources/examples/reference-line.json | 56 + plugins/tableau/resources/examples/sort.json | 25 + .../resources/examples/table-calc.json | 53 + .../examples/topn-table-calc-filter.json | 97 + .../examples/worksheet-bar-chart.json | 76 + plugins/tableau/resources/provenance.json | 21 + .../tableau/resources/references/corpus.json | 904 + .../tableau-desktop-commands-reference.json | 27177 ++++++++++++++++ .../references/twb-example-index.json | 1 + .../references/workbook-schema-reference.json | 10514 ++++++ .../resources/starters/minimal-workbook.twb | 10 + .../templates/executable/box-plot-chart.tbm | 65 + .../executable/bullet-variance-chart.tbm | 64 + .../change-over-time-area-chart.tbm | 59 + .../change-over-time-calendar-heatmap.tbm | 72 + .../change-over-time-stacked-area-chart.tbm | 59 + .../executable/correlation-bubble-chart.tbm | 71 + .../correlation-dual-axis-chart.tbm | 85 + .../distribution-bar-code-chart.tbm | 71 + .../templates/executable/funnel-chart.tbm | 61 + .../executable/gantt-task-rollup-chart.tbm | 62 + .../executable/gantt-timeline-chart.tbm | 62 + .../executable/insights__bar_chart.tbm | 91 + .../executable/insights__line_chart.tbm | 80 + .../templates/executable/kpi-text.tbm | 66 + .../executable/magnitude-paired-bar.tbm | 71 + .../magnitude-paired-column-chart.tbm | 71 + .../executable/magnitude-simple-bar.tbm | 66 + .../executable/part-to-whole-pie-chart.tbm | 64 + .../part-to-whole-stacked-bar-chart.tbm | 72 + .../part-to-whole-treemap-chart.tbm | 69 + .../executable/quota-attainment-bullet.tbm | 64 + .../executable/ranking-dot-strip-plot.tbm | 104 + .../executable/ranking-ordered-bar.tbm | 67 + .../executable/ranking-ordered-column.tbm | 66 + ...emphasize-total-change-more-than-parts.tbm | 4237 +++ ..._reveal-daily-weekly-seasonal-patterns.tbm | 4271 +++ ...ick__show-open-high-low-close-activity.tbm | 575 + ...ized-events-across-time-and-categories.tbm | 4346 +++ ...how-one-series-changing-across-periods.tbm | 1397 + ...r__trace-two-metrics-evolving-together.tbm | 1369 + ...line__compare-two-time-series-directly.tbm | 4316 +++ ...orecast-uncertainty-widening-over-time.tbm | 4239 +++ ...ow-start-duration-and-overlap-of-tasks.tbm | 4276 +++ ..._combine-trend-line-with-filled-volume.tbm | 4306 +++ ...__pair-volume-columns-with-a-rate-line.tbm | 1470 + ...-time__line__default-time-series-trend.tbm | 4225 +++ ...re-many-series-with-optional-highlight.tbm | 4240 +++ ...c__show-open-close-and-high-low-ranges.tbm | 450 + ...e__show-date-and-duration-of-intervals.tbm | 304 + ...igh-variance-series-as-mirrored-spikes.tbm | 4273 +++ ...a__show-composition-changing-over-time.tbm | 4192 +++ ...__show-organic-stacked-flows-over-time.tbm | 4267 +++ .../reference/connected-scatterplot.tbm | 65 + .../templates/reference/control-chart-xmr.tbm | 97 + .../reference/correlation-highlight-table.tbm | 132 + .../correlation-scatter-plot-chart.tbm | 84 + ...wo-measures-and-encode-a-third-by-size.tbm | 1395 + ...w-patterns-across-two-categorical-axes.tbm | 344 + ...ow-two-metrics-move-together-over-time.tbm | 757 + ...late-an-amount-series-to-a-rate-series.tbm | 1416 + ...profile__compare-multivariate-profiles.tbm | 744 + ...catter__relate-two-continuous-measures.tbm | 1383 + ...tterns-between-two-category-dimensions.tbm | 345 + .../templates/reference/deviation-arrow.tbm | 102 + .../reference/deviation-diverging-bar.tbm | 78 + .../reference/deviation-gain-loss-chart.tbm | 170 + .../reference/deviation-spine-chart.tbm | 104 + ...rbell__compare-two-values-per-category.tbm | 4329 +++ ...actual-vs-target-and-performance-bands.tbm | 4291 +++ ...show-positive-and-negative-vs-baseline.tbm | 4334 +++ ...ar__show-sentiment-or-likert-breakdown.tbm | 635 + ...it-one-measure-into-two-opposing-parts.tbm | 761 + ...a__show-above-below-baseline-over-time.tbm | 4303 +++ .../reference/distribution-histogram.tbm | 60 + ...e__show-all-values-as-marks-on-a-strip.tbm | 4246 +++ ...h-point-without-overlap-hiding-density.tbm | 673 + ...median-spread-and-outliers-by-category.tbm | 4252 +++ ...e__show-inequality-or-cumulative-share.tbm | 4353 +++ ...how-min-max-or-range-across-categories.tbm | 4270 +++ ..._show-shape-and-frequency-of-a-measure.tbm | 378 + ...__compare-mirrored-group-distributions.tbm | 394 + ...ll-density-shape-beyond-simple-summary.tbm | 657 + ..._chord__show-two-way-flows-in-a-matrix.tbm | 526 + ...show-relationship-strength-among-nodes.tbm | 525 + ...trace-volume-through-multi-stage-paths.tbm | 4320 +++ ...udget-or-process-steps-with-plus-minus.tbm | 322 + .../templates/reference/gantt-chart.tbm | 118 + ...-pack__compare-part-sizes-without-axes.tbm | 4260 +++ ...itude__column__compare-sizes-from-zero.tbm | 4298 +++ ..._compare-discrete-categories-from-zero.tbm | 4301 +++ ...ollipop__emphasize-values-over-bar-ink.tbm | 4291 +++ ...__compare-two-series-across-categories.tbm | 4281 +++ ...__compare-two-series-across-categories.tbm | 4279 +++ ...compare-entities-across-many-variables.tbm | 1177 + ...with-repeated-icons-whole-numbers-only.tbm | 619 + ...ze-when-fine-differences-do-not-matter.tbm | 1403 + ...many-variables-for-one-or-few-entities.tbm | 1109 + ...how-circular-relative-bars-or-progress.tbm | 634 + .../templates/reference/pareto-chart.tbm | 112 + ...part-to-whole-proportional-stacked-bar.tbm | 84 + .../reference/part-to-whole-waterfall.tbm | 120 + ...c-hierarchical-breakdown-use-sparingly.tbm | 4351 +++ ...show-parts-with-center-space-for-total.tbm | 4326 +++ ...__show-stage-dropoff-through-a-process.tbm | 364 + ...ncode-share-with-both-width-and-height.tbm | 4281 +++ ...hole__pie__simple-few-part-composition.tbm | 4256 +++ ...r-area__compare-parts-on-a-radial-axis.tbm | 687 + ...cked-bar__show-size-and-share-together.tbm | 1410 + ..._compare-composition-across-categories.tbm | 4260 +++ ...nburst__show-nested-hierarchy-as-rings.tbm | 4383 +++ ...ierarchical-sizes-in-nested-rectangles.tbm | 4252 +++ ...grid__show-percentages-as-filled-cells.tbm | 4464 +++ ...__venn__schematic-overlap-between-sets.tbm | 4370 +++ ...dge-start-to-end-with-plus-minus-steps.tbm | 427 + .../reference/ranking-bump-chart.tbm | 170 + ...track-rank-changes-across-many-periods.tbm | 4365 +++ ...efficient-ranks-across-many-categories.tbm | 1432 + ...ank-and-highlight-values-with-less-ink.tbm | 4298 +++ ...rder-when-rank-matters-more-than-value.tbm | 4297 +++ ...rder-when-rank-matters-more-than-value.tbm | 4297 +++ ...-symbol__rank-with-large-value-spreads.tbm | 4273 +++ ...k__show-rank-swaps-between-two-periods.tbm | 4383 +++ ...ank-or-value-change-between-two-points.tbm | 4369 +++ .../reference/sankey-viz-extension.tbm | 336 + .../templates/reference/slope-chart.tbm | 82 + .../reference/spatial-choropleth-map.tbm | 122 + .../reference/spatial-symbol-map-latlon.tbm | 86 + .../reference/spatial-symbol-map.tbm | 85 + ...__cartogram__resize-regions-by-a-value.tbm | 622 + ...ropleth__map-rates-or-ratios-by-region.tbm | 4296 +++ ...how-equal-value-bands-across-geography.tbm | 348 + ...nsity-hotspots-not-tied-to-admin-units.tbm | 751 + ...y__plot-individual-locations-or-events.tbm | 754 + ...m__give-each-region-equal-shape-weight.tbm | 438 + ...flow-map__show-movement-between-places.tbm | 668 + ...tensity-on-a-grid-not-admin-boundaries.tbm | 307 + ...gregate-geography-into-equal-hex-cells.tbm | 347 + ..._map-totals-with-sized-marks-not-rates.tbm | 1152 + ...istort-geography-so-area-encodes-value.tbm | 435 + ...how-magnitude-at-locations-with-height.tbm | 1023 + ...-map__place-sized-marks-at-coordinates.tbm | 4274 +++ .../templates/reference/trend-line-chart.tbm | 71 + .../templates/reference/ww-floating-bars.tbm | 84 + .../templates/reference/ww-ou-arrow.tbm | 278 + .../templates/reference/ww-ou-diff.tbm | 209 + .../scripts/generate_resource_catalog.py | 686 + plugins/tableau/scripts/tableau_resources.py | 2396 ++ .../skills/tableau-pulse-insights/SKILL.md | 37 + .../tableau-workbook-authoring/SKILL.md | 74 + .../references/resource-guide.md | 220 + .../skills/validate-workbook-package/SKILL.md | 7 + .../tests/fixtures/existing-workbook.twb | 54 + .../golden/insights__bar_chart.window.xml | 30 + .../golden/insights__bar_chart.worksheet.xml | 39 + .../golden/insights__line_chart.window.xml | 25 + .../golden/insights__line_chart.worksheet.xml | 33 + .../golden/magnitude-simple-bar.window.xml | 26 + .../golden/magnitude-simple-bar.worksheet.xml | 39 + .../tableau/tests/fixtures/map-workbook.twb | 65 + .../fixtures/metadata-records-workbook.twb | 74 + .../tests/fixtures/target-datasource.xml | 9 + plugins/tableau/tests/golden/insights-bar.twb | 90 + .../tests/golden/insights-line-injected.twb | 112 + .../tests/test_end_to_end_resources.py | 327 + .../tests/test_generate_resource_catalog.py | 588 + plugins/tableau/tests/test_resource_layout.py | 50 + .../tests/test_skill_resource_contract.py | 158 + .../tests/test_tableau_resources_discovery.py | 68 + .../tests/test_tableau_resources_render.py | 1117 + .../test_tableau_resources_target_metadata.py | 366 + .../test_tableau_resources_validation.py | 730 + .../tests/test_tableau_resources_workbook.py | 525 + 193 files changed, 289273 insertions(+), 4 deletions(-) create mode 100644 .agents/plugins/marketplace.json create mode 100644 docs/superpowers/plans/2026-08-18-tableau-plugin-resources.md create mode 100644 docs/superpowers/specs/2026-08-18-tableau-plugin-resources-design.md create mode 100644 plugins/tableau/README.md create mode 100644 plugins/tableau/resources/catalog-overrides.json create mode 100644 plugins/tableau/resources/catalog.json create mode 100644 plugins/tableau/resources/examples/calculated-field.json create mode 100644 plugins/tableau/resources/examples/column-instance-naming.json create mode 100644 plugins/tableau/resources/examples/dashboard-tiled.json create mode 100644 plugins/tableau/resources/examples/dashboard-validation-grid.json create mode 100644 plugins/tableau/resources/examples/dual-axis.json create mode 100644 plugins/tableau/resources/examples/encoding-pane-level.json create mode 100644 plugins/tableau/resources/examples/filter-categorical.json create mode 100644 plugins/tableau/resources/examples/filter-relative-date.json create mode 100644 plugins/tableau/resources/examples/lod-fixed.json create mode 100644 plugins/tableau/resources/examples/mark-encoding.json create mode 100644 plugins/tableau/resources/examples/parameter.json create mode 100644 plugins/tableau/resources/examples/reference-line.json create mode 100644 plugins/tableau/resources/examples/sort.json create mode 100644 plugins/tableau/resources/examples/table-calc.json create mode 100644 plugins/tableau/resources/examples/topn-table-calc-filter.json create mode 100644 plugins/tableau/resources/examples/worksheet-bar-chart.json create mode 100644 plugins/tableau/resources/provenance.json create mode 100644 plugins/tableau/resources/references/corpus.json create mode 100644 plugins/tableau/resources/references/tableau-desktop-commands-reference.json create mode 100644 plugins/tableau/resources/references/twb-example-index.json create mode 100644 plugins/tableau/resources/references/workbook-schema-reference.json create mode 100644 plugins/tableau/resources/starters/minimal-workbook.twb create mode 100644 plugins/tableau/resources/templates/executable/box-plot-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/bullet-variance-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/change-over-time-area-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/change-over-time-calendar-heatmap.tbm create mode 100644 plugins/tableau/resources/templates/executable/change-over-time-stacked-area-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/correlation-bubble-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/correlation-dual-axis-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/distribution-bar-code-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/funnel-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/gantt-task-rollup-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/gantt-timeline-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/insights__bar_chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/insights__line_chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/kpi-text.tbm create mode 100644 plugins/tableau/resources/templates/executable/magnitude-paired-bar.tbm create mode 100644 plugins/tableau/resources/templates/executable/magnitude-paired-column-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/magnitude-simple-bar.tbm create mode 100644 plugins/tableau/resources/templates/executable/part-to-whole-pie-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/part-to-whole-stacked-bar-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/part-to-whole-treemap-chart.tbm create mode 100644 plugins/tableau/resources/templates/executable/quota-attainment-bullet.tbm create mode 100644 plugins/tableau/resources/templates/executable/ranking-dot-strip-plot.tbm create mode 100644 plugins/tableau/resources/templates/executable/ranking-ordered-bar.tbm create mode 100644 plugins/tableau/resources/templates/executable/ranking-ordered-column.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__area__emphasize-total-change-more-than-parts.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__calendar-heatmap__reveal-daily-weekly-seasonal-patterns.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__candlestick__show-open-high-low-close-activity.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__circle-timeline__show-sized-events-across-time-and-categories.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__column__show-one-series-changing-across-periods.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__connected-scatter__trace-two-metrics-evolving-together.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__dual-line__compare-two-time-series-directly.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__fan__show-forecast-uncertainty-widening-over-time.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__gantt__show-start-duration-and-overlap-of-tasks.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__line-plus-area__combine-trend-line-with-filled-volume.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__line-plus-column__pair-volume-columns-with-a-rate-line.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__line__default-time-series-trend.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__multi-line__compare-many-series-with-optional-highlight.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__ohlc__show-open-close-and-high-low-ranges.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__priestley-timeline__show-date-and-duration-of-intervals.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__seismogram__show-high-variance-series-as-mirrored-spikes.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__stacked-area__show-composition-changing-over-time.tbm create mode 100644 plugins/tableau/resources/templates/reference/change-over-time__steamgraph__show-organic-stacked-flows-over-time.tbm create mode 100644 plugins/tableau/resources/templates/reference/connected-scatterplot.tbm create mode 100644 plugins/tableau/resources/templates/reference/control-chart-xmr.tbm create mode 100644 plugins/tableau/resources/templates/reference/correlation-highlight-table.tbm create mode 100644 plugins/tableau/resources/templates/reference/correlation-scatter-plot-chart.tbm create mode 100644 plugins/tableau/resources/templates/reference/correlation__bubble-scatter__relate-two-measures-and-encode-a-third-by-size.tbm create mode 100644 plugins/tableau/resources/templates/reference/correlation__category-heatmap__show-patterns-across-two-categorical-axes.tbm create mode 100644 plugins/tableau/resources/templates/reference/correlation__connected-scatter__show-how-two-metrics-move-together-over-time.tbm create mode 100644 plugins/tableau/resources/templates/reference/correlation__line-plus-column__relate-an-amount-series-to-a-rate-series.tbm create mode 100644 plugins/tableau/resources/templates/reference/correlation__radar-profile__compare-multivariate-profiles.tbm create mode 100644 plugins/tableau/resources/templates/reference/correlation__scatter__relate-two-continuous-measures.tbm create mode 100644 plugins/tableau/resources/templates/reference/correlation__xy-heatmap__show-patterns-between-two-category-dimensions.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation-arrow.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation-diverging-bar.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation-gain-loss-chart.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation-spine-chart.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation__barbell__compare-two-values-per-category.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation__bullet__track-actual-vs-target-and-performance-bands.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation__diverging-bar__show-positive-and-negative-vs-baseline.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation__diverging-stacked-bar__show-sentiment-or-likert-breakdown.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation__spine__split-one-measure-into-two-opposing-parts.tbm create mode 100644 plugins/tableau/resources/templates/reference/deviation__surplus-deficit-area__show-above-below-baseline-over-time.tbm create mode 100644 plugins/tableau/resources/templates/reference/distribution-histogram.tbm create mode 100644 plugins/tableau/resources/templates/reference/distribution__barcode__show-all-values-as-marks-on-a-strip.tbm create mode 100644 plugins/tableau/resources/templates/reference/distribution__beeswarm__show-each-point-without-overlap-hiding-density.tbm create mode 100644 plugins/tableau/resources/templates/reference/distribution__boxplot__summarize-median-spread-and-outliers-by-category.tbm create mode 100644 plugins/tableau/resources/templates/reference/distribution__cumulative-curve__show-inequality-or-cumulative-share.tbm create mode 100644 plugins/tableau/resources/templates/reference/distribution__dot-plot__show-min-max-or-range-across-categories.tbm create mode 100644 plugins/tableau/resources/templates/reference/distribution__histogram__show-shape-and-frequency-of-a-measure.tbm create mode 100644 plugins/tableau/resources/templates/reference/distribution__population-pyramid__compare-mirrored-group-distributions.tbm create mode 100644 plugins/tableau/resources/templates/reference/distribution__violin__show-full-density-shape-beyond-simple-summary.tbm create mode 100644 plugins/tableau/resources/templates/reference/flow__chord__show-two-way-flows-in-a-matrix.tbm create mode 100644 plugins/tableau/resources/templates/reference/flow__network__show-relationship-strength-among-nodes.tbm create mode 100644 plugins/tableau/resources/templates/reference/flow__sankey__trace-volume-through-multi-stage-paths.tbm create mode 100644 plugins/tableau/resources/templates/reference/flow__waterfall__sequence-budget-or-process-steps-with-plus-minus.tbm create mode 100644 plugins/tableau/resources/templates/reference/gantt-chart.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__bubble-pack__compare-part-sizes-without-axes.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__column__compare-sizes-from-zero.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__horizontal-bar__compare-discrete-categories-from-zero.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__lollipop__emphasize-values-over-bar-ink.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__paired-bar__compare-two-series-across-categories.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__paired-column__compare-two-series-across-categories.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__parallel-coordinates__compare-entities-across-many-variables.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__pictogram__count-with-repeated-icons-whole-numbers-only.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__proportional-symbol__show-size-when-fine-differences-do-not-matter.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__radar__compare-many-variables-for-one-or-few-entities.tbm create mode 100644 plugins/tableau/resources/templates/reference/magnitude__radial-bar__show-circular-relative-bars-or-progress.tbm create mode 100644 plugins/tableau/resources/templates/reference/pareto-chart.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole-proportional-stacked-bar.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole-waterfall.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__arc__schematic-hierarchical-breakdown-use-sparingly.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__donut__show-parts-with-center-space-for-total.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__funnel__show-stage-dropoff-through-a-process.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__marimekko__encode-share-with-both-width-and-height.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__pie__simple-few-part-composition.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__polar-area__compare-parts-on-a-radial-axis.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__proportional-stacked-bar__show-size-and-share-together.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__stacked-column__compare-composition-across-categories.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__sunburst__show-nested-hierarchy-as-rings.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__treemap__show-hierarchical-sizes-in-nested-rectangles.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__unit-grid__show-percentages-as-filled-cells.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__venn__schematic-overlap-between-sets.tbm create mode 100644 plugins/tableau/resources/templates/reference/part-to-whole__waterfall__bridge-start-to-end-with-plus-minus-steps.tbm create mode 100644 plugins/tableau/resources/templates/reference/ranking-bump-chart.tbm create mode 100644 plugins/tableau/resources/templates/reference/ranking__bump__track-rank-changes-across-many-periods.tbm create mode 100644 plugins/tableau/resources/templates/reference/ranking__dot-strip__space-efficient-ranks-across-many-categories.tbm create mode 100644 plugins/tableau/resources/templates/reference/ranking__lollipop__rank-and-highlight-values-with-less-ink.tbm create mode 100644 plugins/tableau/resources/templates/reference/ranking__ordered-bar__show-order-when-rank-matters-more-than-value.tbm create mode 100644 plugins/tableau/resources/templates/reference/ranking__ordered-column__show-order-when-rank-matters-more-than-value.tbm create mode 100644 plugins/tableau/resources/templates/reference/ranking__ordered-proportional-symbol__rank-with-large-value-spreads.tbm create mode 100644 plugins/tableau/resources/templates/reference/ranking__slope-rank__show-rank-swaps-between-two-periods.tbm create mode 100644 plugins/tableau/resources/templates/reference/ranking__slope__compare-rank-or-value-change-between-two-points.tbm create mode 100644 plugins/tableau/resources/templates/reference/sankey-viz-extension.tbm create mode 100644 plugins/tableau/resources/templates/reference/slope-chart.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial-choropleth-map.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial-symbol-map-latlon.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial-symbol-map.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__cartogram__resize-regions-by-a-value.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__choropleth__map-rates-or-ratios-by-region.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__contour__show-equal-value-bands-across-geography.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__density-map__show-intensity-hotspots-not-tied-to-admin-units.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__dot-density__plot-individual-locations-or-events.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__equalized-cartogram__give-each-region-equal-shape-weight.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__flow-map__show-movement-between-places.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__grid-heatmap__map-intensity-on-a-grid-not-admin-boundaries.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__hexbin-map__aggregate-geography-into-equal-hex-cells.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__proportional-symbol-map__map-totals-with-sized-marks-not-rates.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__scaled-cartogram__distort-geography-so-area-encodes-value.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__spike-map__show-magnitude-at-locations-with-height.tbm create mode 100644 plugins/tableau/resources/templates/reference/spatial__symbol-map__place-sized-marks-at-coordinates.tbm create mode 100644 plugins/tableau/resources/templates/reference/trend-line-chart.tbm create mode 100644 plugins/tableau/resources/templates/reference/ww-floating-bars.tbm create mode 100644 plugins/tableau/resources/templates/reference/ww-ou-arrow.tbm create mode 100644 plugins/tableau/resources/templates/reference/ww-ou-diff.tbm create mode 100644 plugins/tableau/scripts/generate_resource_catalog.py create mode 100755 plugins/tableau/scripts/tableau_resources.py create mode 100644 plugins/tableau/skills/tableau-pulse-insights/SKILL.md create mode 100644 plugins/tableau/skills/tableau-workbook-authoring/SKILL.md create mode 100644 plugins/tableau/skills/tableau-workbook-authoring/references/resource-guide.md create mode 100644 plugins/tableau/tests/fixtures/existing-workbook.twb create mode 100644 plugins/tableau/tests/fixtures/golden/insights__bar_chart.window.xml create mode 100644 plugins/tableau/tests/fixtures/golden/insights__bar_chart.worksheet.xml create mode 100644 plugins/tableau/tests/fixtures/golden/insights__line_chart.window.xml create mode 100644 plugins/tableau/tests/fixtures/golden/insights__line_chart.worksheet.xml create mode 100644 plugins/tableau/tests/fixtures/golden/magnitude-simple-bar.window.xml create mode 100644 plugins/tableau/tests/fixtures/golden/magnitude-simple-bar.worksheet.xml create mode 100644 plugins/tableau/tests/fixtures/map-workbook.twb create mode 100644 plugins/tableau/tests/fixtures/metadata-records-workbook.twb create mode 100644 plugins/tableau/tests/fixtures/target-datasource.xml create mode 100644 plugins/tableau/tests/golden/insights-bar.twb create mode 100644 plugins/tableau/tests/golden/insights-line-injected.twb create mode 100644 plugins/tableau/tests/test_end_to_end_resources.py create mode 100644 plugins/tableau/tests/test_generate_resource_catalog.py create mode 100644 plugins/tableau/tests/test_resource_layout.py create mode 100644 plugins/tableau/tests/test_skill_resource_contract.py create mode 100644 plugins/tableau/tests/test_tableau_resources_discovery.py create mode 100644 plugins/tableau/tests/test_tableau_resources_render.py create mode 100644 plugins/tableau/tests/test_tableau_resources_target_metadata.py create mode 100644 plugins/tableau/tests/test_tableau_resources_validation.py create mode 100644 plugins/tableau/tests/test_tableau_resources_workbook.py diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json new file mode 100644 index 0000000..de74e6c --- /dev/null +++ b/.agents/plugins/marketplace.json @@ -0,0 +1,20 @@ +{ + "name": "tableau-plugin-marketplace", + "interface": { + "displayName": "Tableau Plugins" + }, + "plugins": [ + { + "name": "tableau", + "source": { + "source": "local", + "path": "./plugins/tableau" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Productivity" + } + ] +} diff --git a/.gitignore b/.gitignore index 52f96dd..76cb482 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ # Local reference checkout used to model this plugin. sample-plugin/ .cursor + +# OS and interpreter cruft that must never become catalog resources. +.DS_Store +__pycache__/ diff --git a/README.md b/README.md index 651d9b4..68aa2ff 100644 --- a/README.md +++ b/README.md @@ -13,5 +13,15 @@ codex plugin add tableau@tableau-plugin-marketplace ## Included -- Tableau workbook package validation skill +- A resource catalog (`plugins/tableau/resources/catalog.json`) of chart + templates, worked examples, and reference docs, each tagged `executable` + (renderable into a workbook) or `reference` (inspiration only) +- A CLI, `plugins/tableau/scripts/tableau_resources.py`, to discover, + inspect, and safely transform `.twb` workbooks against that catalog +- Skills covering the authoring flow — download-or-starter → transform + (`instantiate`/`inject`) → validate → publish — general workbook + authoring, Pulse Insights charts, and workbook package validation - Hosted Tableau MCP server at + +See `plugins/tableau/README.md` for the full CLI reference and authoring +flow. diff --git a/docs/superpowers/plans/2026-08-18-tableau-plugin-resources.md b/docs/superpowers/plans/2026-08-18-tableau-plugin-resources.md new file mode 100644 index 0000000..3d8da6b --- /dev/null +++ b/docs/superpowers/plans/2026-08-18-tableau-plugin-resources.md @@ -0,0 +1,1033 @@ +# Tableau Plugin Resources Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Expose Tableau workbook resources through Codex skills and provide a deterministic local CLI that can discover, inspect, instantiate, inject, and validate a safe subset of Tableau bookmark templates. + +**Architecture:** All resources are indexed in one generated catalog. Skills provide Codex discovery entry points, while a Python standard-library CLI performs explicit field mapping and bounded XML transformations against starter or existing `.twb` files; publishing remains in the existing Tableau API workflow. + +**Tech Stack:** Python 3.11+ standard library (`argparse`, `dataclasses`, `hashlib`, `json`, `pathlib`, `re`, `tempfile`, `unittest`, `uuid`, `xml.etree.ElementTree`), Markdown Agent Skills, Tableau `.tbm`/`.twb` XML, JSON. + +## Global Constraints + +- Do not depend on Tableau Desktop or its external client API. +- Do not add third-party Python packages. +- Never modify an input `.twb` unless the caller passes `--overwrite`. +- Never classify a template as executable solely from its filename or naming cohort. +- Never fabricate Tableau datasource connection metadata. +- Reference resources are readable but must fail closed if passed to `instantiate` or `inject`. +- Every generated catalog entry records a SHA-256 integrity hash. +- Pin imported Pulse resources to `tableau/tableau-mcp` commit `3e77dd40997a2ffcb89fb25fa40c9abc1ac59a71`. +- Keep authentication, package validation, and publishing outside the resource CLI. +- Do not create a git commit unless the user explicitly requests one. + +## File map + +- `plugins/tableau/resources/catalog.json`: generated resource index consumed at runtime. +- `plugins/tableau/resources/catalog-overrides.json`: reviewed metadata for parameter types and stricter classification. +- `plugins/tableau/resources/provenance.json`: pinned upstream source and import paths. +- `plugins/tableau/resources/templates/{executable,reference}/`: classified Tableau bookmarks. +- `plugins/tableau/resources/examples/`: XML-authoring examples. +- `plugins/tableau/resources/references/`: schema, command, snippet, and diff corpora. +- `plugins/tableau/resources/starters/minimal-workbook.twb`: datasource-free workbook shell. +- `plugins/tableau/scripts/generate_resource_catalog.py`: deterministic catalog generator and eligibility classifier. +- `plugins/tableau/scripts/tableau_resources.py`: discovery and workbook-transformation CLI. +- `plugins/tableau/tests/`: standard-library unit and golden-fixture tests. +- `plugins/tableau/skills/tableau-workbook-authoring/SKILL.md`: primary Codex workflow. +- `plugins/tableau/skills/tableau-pulse-insights/SKILL.md`: focused Pulse Insights entry point. +- `plugins/tableau/README.md`: resource CLI reference for maintainers. +- `plugins/tableau/.codex-plugin/plugin.json`: plugin descriptions and starter prompts. + +--- + +### Task 1: Normalize and pin the resource corpus + +**Files:** +- Move: `plugins/tableau/data/templates/*.tbm` to temporary classified resource directories. +- Move: `plugins/tableau/data/examples/*.json` to `plugins/tableau/resources/examples/`. +- Move: `plugins/tableau/data/{corpus,twb-example-index,workbook-schema-reference,tableau-desktop-commands-reference}.json` to `plugins/tableau/resources/references/`. +- Create: `plugins/tableau/resources/provenance.json` +- Create: `plugins/tableau/resources/catalog-overrides.json` +- Create: `plugins/tableau/resources/starters/minimal-workbook.twb` +- Test: `plugins/tableau/tests/test_resource_layout.py` + +**Interfaces:** +- Produces canonical resource root `plugins/tableau/resources`. +- Produces provenance schema `{schemaVersion, sources[]}`. +- Produces overrides keyed by resource ID. + +- [ ] **Step 1: Write the failing resource-layout test** + +```python +# plugins/tableau/tests/test_resource_layout.py +import hashlib +import json +from pathlib import Path +import unittest +import xml.etree.ElementTree as ET + +PLUGIN = Path(__file__).resolve().parents[1] +RESOURCES = PLUGIN / "resources" + + +class ResourceLayoutTest(unittest.TestCase): + def test_required_layout_and_pinned_pulse_resources(self) -> None: + provenance = json.loads((RESOURCES / "provenance.json").read_text()) + self.assertEqual(provenance["schemaVersion"], 1) + self.assertEqual( + provenance["sources"][0]["commit"], + "3e77dd40997a2ffcb89fb25fa40c9abc1ac59a71", + ) + for name in ("insights__bar_chart.tbm", "insights__line_chart.tbm"): + matches = list((RESOURCES / "templates").glob(f"*/{name}")) + self.assertEqual(len(matches), 1, name) + self.assertEqual(ET.parse(matches[0]).getroot().tag, "bookmark") + + def test_every_declared_import_hash_matches(self) -> None: + provenance = json.loads((RESOURCES / "provenance.json").read_text()) + for source in provenance["sources"]: + for imported in source["imports"]: + matches = list((RESOURCES / "templates").glob(f"*/{imported['filename']}")) + self.assertEqual(len(matches), 1, imported["filename"]) + path = matches[0] + digest = hashlib.sha256(path.read_bytes()).hexdigest() + self.assertEqual(digest, imported["sha256"], path) + + def test_starter_is_datasource_free_workbook(self) -> None: + root = ET.parse(RESOURCES / "starters/minimal-workbook.twb").getroot() + self.assertEqual(root.tag, "workbook") + datasources = root.find("datasources") + self.assertIsNotNone(datasources) + self.assertEqual(len(list(datasources)), 0) + self.assertIsNotNone(root.find("worksheets")) + self.assertIsNotNone(root.find("windows")) +``` + +- [ ] **Step 2: Run the layout test and verify it fails** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_resource_layout.py -v +``` + +Expected: FAIL because `resources/provenance.json` and the normalized layout do not exist. + +- [ ] **Step 3: Create the normalized directories and move the current corpus** + +Run: + +```bash +mkdir -p \ + "plugins/tableau/resources/templates/unclassified" \ + "plugins/tableau/resources/examples" \ + "plugins/tableau/resources/references" \ + "plugins/tableau/resources/starters" +mv plugins/tableau/data/templates/*.tbm "plugins/tableau/resources/templates/unclassified/" +mv plugins/tableau/data/examples/*.json "plugins/tableau/resources/examples/" +mv plugins/tableau/data/corpus.json "plugins/tableau/resources/references/" +mv plugins/tableau/data/twb-example-index.json "plugins/tableau/resources/references/" +mv plugins/tableau/data/workbook-schema-reference.json "plugins/tableau/resources/references/" +mv plugins/tableau/data/tableau-desktop-commands-reference.json "plugins/tableau/resources/references/" +rmdir "plugins/tableau/data/examples" "plugins/tableau/data/templates" "plugins/tableau/data" +``` + +- [ ] **Step 4: Import the two pinned Pulse Insights bookmarks** + +Run both commands at the pinned commit: + +```bash +gh api "repos/tableau/tableau-mcp/contents/src/desktop/data/templates/insights__bar_chart.tbm?ref=3e77dd40997a2ffcb89fb25fa40c9abc1ac59a71" \ + --jq '.content' | base64 --decode \ + > "plugins/tableau/resources/templates/unclassified/insights__bar_chart.tbm" +gh api "repos/tableau/tableau-mcp/contents/src/desktop/data/templates/insights__line_chart.tbm?ref=3e77dd40997a2ffcb89fb25fa40c9abc1ac59a71" \ + --jq '.content' | base64 --decode \ + > "plugins/tableau/resources/templates/unclassified/insights__line_chart.tbm" +``` + +- [ ] **Step 5: Create provenance and reviewed overrides** + +Create `provenance.json` with source repository, commit, and an `imports` +array. Each import contains `filename`, `upstreamPath`, and `sha256`; omitting +the tier directory keeps provenance stable when classification moves a file. +Generate hashes from local bytes; do not hand-copy them. + +Create `catalog-overrides.json`: + +```json +{ + "schemaVersion": 1, + "resources": { + "insights__bar_chart": { + "family": "pulse-insights", + "intent": "Rank products by ARR within a date range", + "parameters": { + "DATE_MIN": {"type": "date", "required": true}, + "DATE_MAX": {"type": "date", "required": true}, + "DIRECTION": { + "type": "enum", + "required": true, + "allowed": ["ASC", "DESC"] + } + } + }, + "insights__line_chart": { + "family": "pulse-insights", + "intent": "Show ARR over close date with a trend line", + "parameters": {} + } + } +} +``` + +- [ ] **Step 6: Create the minimal workbook starter** + +```xml + + + + + + + + + + +``` + +- [ ] **Step 7: Generate provenance hashes and rerun the test** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_resource_layout.py -v +``` + +Expected: PASS with 3 tests. + +### Task 2: Generate the searchable resource catalog + +**Files:** +- Create: `plugins/tableau/scripts/generate_resource_catalog.py` +- Create: `plugins/tableau/resources/catalog.json` +- Create: `plugins/tableau/tests/test_generate_resource_catalog.py` + +**Interfaces:** +- Produces `generate_catalog(plugin_root: Path) -> dict[str, object]`. +- Produces one entry per resource with `id`, `type`, `family`, `intent`, `path`, `tier`, `classificationReasons`, `datasources`, `fields`, `parameters`, `keywords`, and `sha256`. +- Moves each `.tbm` from `templates/unclassified` into `templates/executable` or `templates/reference`. + +- [ ] **Step 1: Write failing catalog tests** + +```python +# plugins/tableau/tests/test_generate_resource_catalog.py +import json +from pathlib import Path +import sys +import unittest + +PLUGIN = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN / "scripts")) +from generate_resource_catalog import generate_catalog + + +class CatalogGenerationTest(unittest.TestCase): + def test_catalog_is_deterministic_and_complete(self) -> None: + first = generate_catalog(PLUGIN) + second = generate_catalog(PLUGIN) + self.assertEqual(first, second) + ids = [item["id"] for item in first["resources"]] + self.assertEqual(ids, sorted(ids)) + self.assertEqual(len(ids), len(set(ids))) + self.assertIn("insights__bar_chart", ids) + self.assertIn("insights__line_chart", ids) + + def test_pulse_bar_contract_is_inferred_and_overridden(self) -> None: + catalog = generate_catalog(PLUGIN) + item = next(r for r in catalog["resources"] if r["id"] == "insights__bar_chart") + self.assertEqual(item["family"], "pulse-insights") + self.assertEqual(item["tier"], "executable") + self.assertEqual( + sorted(item["parameters"]), + ["DATE_MAX", "DATE_MIN", "DIRECTION"], + ) + self.assertEqual( + {field["sourceField"] for field in item["fields"]}, + {"ARR", "Close Date", "Product"}, + ) + + def test_inline_datasource_template_is_reference_only(self) -> None: + catalog = generate_catalog(PLUGIN) + item = next( + r for r in catalog["resources"] + if r["id"] == "magnitude__horizontal-bar__compare-discrete-categories-from-zero" + ) + self.assertEqual(item["tier"], "reference") + self.assertIn("inline-datasource", item["classificationReasons"]) + + def test_checked_in_catalog_matches_generation(self) -> None: + expected = generate_catalog(PLUGIN) + actual = json.loads((PLUGIN / "resources/catalog.json").read_text()) + self.assertEqual(actual, expected) +``` + +- [ ] **Step 2: Run the catalog tests and verify they fail** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_generate_resource_catalog.py -v +``` + +Expected: FAIL because `generate_resource_catalog` does not exist. + +- [ ] **Step 3: Implement bookmark metadata extraction** + +Implement these typed functions in `generate_resource_catalog.py`: + +- `sha256(path: Path) -> str` +- `strip_brackets(value: str) -> str` +- `extract_parameters(text: str) -> list[str]` +- `extract_bookmark(path: Path) -> dict[str, object]` +- `classify_bookmark(metadata: dict[str, object]) -> tuple[str, list[str]]` +- `generate_catalog(plugin_root: Path) -> dict[str, object]` + +`extract_bookmark` must: + +1. Parse the bookmark with `ElementTree`. +2. Collect unique donor datasource names from `datasource@name`, + `datasource-dependencies@datasource`, and qualified field references. +3. Build a column dictionary from each `` and a column-instance map + from each ``. +4. Walk rows, columns, marks encodings, filters, slices, titles, and reference + lines for placed field references. +5. Resolve every placed column instance to a base source field, datatype, + role, derivation, and shelf. +6. Extract uppercase `{{PARAMETER}}` names without treating + `{{DATASOURCE}}` or `{{field_base_N}}` as explicit parameters. +7. Detect inline datasources, connections, viz extensions, unresolved field + references, missing column metadata, and calculation dependencies. + +`classify_bookmark` returns `reference` with stable sorted reason IDs whenever +any blocker exists: + +```python +BLOCKERS = { + "multiple-datasources", + "inline-datasource", + "connection-dependency", + "viz-extension", + "missing-column-metadata", + "unresolved-field-reference", + "external-calculation-dependency", + "invalid-bookmark-shape", +} +``` + +Overrides may provide family, intent, and parameter validation, but may not +remove a blocker or promote a failed resource to executable. + +- [ ] **Step 4: Implement deterministic output and classification moves** + +Scan all three template directories (`unclassified`, `executable`, and +`reference`) and compute each entry's canonical tier path from classification, +not its current location. Sort catalog entries by `id`, sort all string arrays, +serialize with `indent=2`, and end with a newline. In `--write` mode, move +bookmarks into their tier directory only after all entries are generated +successfully; preserve file bytes. In `--check` mode, perform no writes and +exit 1 if catalog content or physical tier paths differ from generation. + +The top-level shape is: + +```json +{ + "schemaVersion": 1, + "generatedFrom": { + "provenance": "./provenance.json", + "overrides": "./catalog-overrides.json" + }, + "resources": [] +} +``` + +- [ ] **Step 5: Generate the catalog and run the tests** + +Run: + +```bash +python3 plugins/tableau/scripts/generate_resource_catalog.py \ + --plugin-root plugins/tableau \ + --write +python3 -m unittest plugins/tableau/tests/test_generate_resource_catalog.py -v +``` + +Expected: PASS with 4 tests and a checked-in `resources/catalog.json`. + +### Task 3: Add catalog discovery and inspection commands + +**Files:** +- Create: `plugins/tableau/scripts/tableau_resources.py` +- Create: `plugins/tableau/tests/test_tableau_resources_discovery.py` + +**Interfaces:** +- Produces `load_catalog(plugin_root: Path) -> dict[str, object]`. +- Produces `search_resources(catalog, query, family, resource_type, tier) -> list[dict[str, object]]`. +- CLI commands: `list` and `inspect`. +- JSON output is the default; `--format text` produces concise human-readable output. + +- [ ] **Step 1: Write failing discovery tests** + +```python +# plugins/tableau/tests/test_tableau_resources_discovery.py +import json +from pathlib import Path +import subprocess +import sys +import unittest + +PLUGIN = Path(__file__).resolve().parents[1] +CLI = PLUGIN / "scripts/tableau_resources.py" + + +class ResourceDiscoveryTest(unittest.TestCase): + def run_cli(self, *args: str) -> subprocess.CompletedProcess[str]: + return subprocess.run( + [sys.executable, str(CLI), *args], + text=True, + capture_output=True, + check=False, + ) + + def test_list_filters_pulse_executable_resources(self) -> None: + result = self.run_cli("list", "--family", "pulse-insights", "--tier", "executable") + self.assertEqual(result.returncode, 0, result.stderr) + ids = [item["id"] for item in json.loads(result.stdout)] + self.assertEqual(ids, ["insights__bar_chart", "insights__line_chart"]) + + def test_list_searches_intent_and_keywords(self) -> None: + result = self.run_cli("list", "--query", "trend ARR") + self.assertEqual(result.returncode, 0, result.stderr) + self.assertIn("insights__line_chart", result.stdout) + + def test_inspect_returns_mapping_contract(self) -> None: + result = self.run_cli("inspect", "insights__bar_chart") + self.assertEqual(result.returncode, 0, result.stderr) + item = json.loads(result.stdout) + self.assertEqual(item["tier"], "executable") + self.assertTrue(item["fields"]) + + def test_unknown_resource_fails_closed(self) -> None: + result = self.run_cli("inspect", "does-not-exist") + self.assertEqual(result.returncode, 2) + self.assertIn("Unknown resource", result.stderr) +``` + +- [ ] **Step 2: Run the discovery tests and verify they fail** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_tableau_resources_discovery.py -v +``` + +Expected: FAIL because the CLI does not exist. + +- [ ] **Step 3: Implement catalog loading, search scoring, and command parsing** + +Implement these typed functions: + +- `load_catalog(plugin_root: Path) -> dict[str, object]` +- `find_resource(catalog: dict[str, object], resource_id: str) -> dict[str, object]` +- `search_resources(catalog: dict[str, object], *, query: str | None, family: str | None, resource_type: str | None, tier: str | None) -> list[dict[str, object]]` +- `build_parser() -> argparse.ArgumentParser` +- `main(argv: list[str] | None = None) -> int` + +Search splits the query into lowercase alphanumeric terms. An entry matches +only when every term appears in its ID, intent, family, or keywords. Sort exact +ID matches first, then entries with terms in intent, then by ID. + +The CLI discovers its plugin root from +`Path(__file__).resolve().parents[1]`; it must not depend on the current working +directory. + +- [ ] **Step 4: Run discovery tests** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_tableau_resources_discovery.py -v +``` + +Expected: PASS with 4 tests. + +### Task 4: Render executable bookmarks with explicit mappings + +**Files:** +- Modify: `plugins/tableau/scripts/tableau_resources.py` +- Create: `plugins/tableau/tests/fixtures/target-datasource.xml` +- Create: `plugins/tableau/tests/test_tableau_resources_render.py` + +**Interfaces:** +- Produces `parse_assignments(values: list[str]) -> dict[str, str]`. +- Produces `render_bookmark(plugin_root, resource_id, worksheet_name, datasource_name, field_mappings, parameters) -> tuple[str, str]` for worksheet and window fragments. +- Consumes catalog field/parameter contracts. + +- [ ] **Step 1: Add failing mapping and rendering tests** + +Use a fixture datasource named `Sales Data` with fields `Revenue`, +`Transaction Date`, and `Offering`. + +```python +def test_render_pulse_bar_rewrites_all_donor_references(self) -> None: + worksheet, window = render_bookmark( + plugin_root=PLUGIN, + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + datasource_name="Sales Data", + field_mappings={ + "ARR": "Revenue", + "Close Date": "Transaction Date", + "Product": "Offering", + }, + parameters={ + "DATE_MIN": "2026-01-01", + "DATE_MAX": "2026-06-30", + "DIRECTION": "DESC", + }, + ) + combined = worksheet + window + self.assertNotIn("Sample - Superstore", combined) + self.assertNotIn("{{", combined) + self.assertIn("[Sales Data].[sum:Revenue:qk]", combined) + self.assertIn("[Sales Data].[none:Offering:nk]", combined) + self.assertIn("#2026-01-01#", combined) + self.assertIn("name='ARR by Offering'", combined) + +def test_missing_required_mapping_fails(self) -> None: + with self.assertRaisesRegex(ResourceError, "Missing field mappings: Product"): + render_bookmark( + plugin_root=PLUGIN, + resource_id="insights__bar_chart", + worksheet_name="Incomplete", + datasource_name="Sales Data", + field_mappings={"ARR": "Revenue", "Close Date": "Transaction Date"}, + parameters={ + "DATE_MIN": "2026-01-01", + "DATE_MAX": "2026-06-30", + "DIRECTION": "DESC", + }, + ) + +def test_reference_resource_fails_closed(self) -> None: + with self.assertRaisesRegex(ResourceError, "reference-only"): + render_bookmark( + plugin_root=PLUGIN, + resource_id="magnitude__horizontal-bar__compare-discrete-categories-from-zero", + worksheet_name="Blocked", + datasource_name="Sales Data", + field_mappings={}, + parameters={}, + ) +``` + +- [ ] **Step 2: Run rendering tests and verify they fail** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_tableau_resources_render.py -v +``` + +Expected: FAIL because `render_bookmark` does not exist. + +- [ ] **Step 3: Implement assignment and contract validation** + +Implement `ResourceError(ValueError)` and: + +```python +def parse_assignments(values: list[str]) -> dict[str, str]: + assignments: dict[str, str] = {} + for value in values: + if "=" not in value: + raise ResourceError(f"Expected NAME=VALUE, got: {value}") + name, mapped = value.split("=", 1) + if not name.strip() or not mapped.strip() or name in assignments: + raise ResourceError(f"Invalid or duplicate assignment: {value}") + assignments[name.strip()] = mapped.strip() + return assignments +``` + +Validate dates with `datetime.date.fromisoformat`, enums against +`allowed`, required parameters exactly once, and reject assignments not +declared by the resource contract. + +- [ ] **Step 4: Implement bounded bookmark conversion** + +`render_bookmark` must: + +1. Reject any resource whose tier is not `executable`. +2. Read and hash the `.tbm`; reject drift from the catalog hash. +3. Extract exactly one `` and one `` using parser-confirmed + offsets; hoist root-level `` into the window when needed. +4. Remove `` blocks because they are transient donor state. +5. Replace donor datasource names in attributes and qualified references. +6. Replace source field names only in bracketed base fields and + `derivation:field:role` segments, longest field name first. +7. Replace validated explicit parameters. +8. Wrap the table in a `` whose escaped `name` is the supplied + `worksheet_name`. +9. Set the window class and name to the output worksheet name. +10. Replace fragment `simple-id` values with UUID5 values derived from + `resource_id + worksheet_name + fragment_kind`. +11. Reject output containing donor-qualified references, any source field + whose mapping target differs, text matching `\{\{[^}]+\}\}`, or + `federated.XXXX`. Identity field mappings remain valid. +12. Parse both fragments inside temporary XML wrapper roots before returning. + +Use Tableau bracket escaping (`]` becomes `]]`) and XML-escape attribute +values. Do not serialize the source bookmark through `ElementTree`. + +- [ ] **Step 5: Run rendering tests** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_tableau_resources_render.py -v +``` + +Expected: PASS, including golden output for both Pulse templates and one +portable non-Pulse bar template. + +### Task 5: Instantiate and inject workbook files safely + +**Files:** +- Modify: `plugins/tableau/scripts/tableau_resources.py` +- Create: `plugins/tableau/tests/fixtures/existing-workbook.twb` +- Create: `plugins/tableau/tests/fixtures/target-datasource.xml` +- Create: `plugins/tableau/tests/test_tableau_resources_workbook.py` + +**Interfaces:** +- Produces `inspect_datasources(twb_text: str) -> dict[str, set[str]]`. +- Produces `inject_fragments(twb_text, worksheet, window) -> str`. +- Produces `instantiate_resource` and `inject_resource`, each returning the + complete transformed workbook text before atomic write. +- Produces `atomic_write(path: Path, content: str, overwrite: bool) -> None`. +- CLI commands: `instantiate` and `inject`. + +- [ ] **Step 1: Write failing workbook transformation tests** + +```python +def test_inject_preserves_unrelated_bytes(self) -> None: + original = (FIXTURES / "existing-workbook.twb").read_text() + marker = "" + output = inject_resource( + input_path=FIXTURES / "existing-workbook.twb", + output_path=self.tmp / "output.twb", + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name="Sales Data", + field_mappings={"ARR": "Revenue", "Close Date": "Transaction Date"}, + parameters={}, + ) + self.assertIn(marker, output) + self.assertEqual( + original[: original.index("")], + output[: output.index("")], + ) + +def test_instantiate_inserts_one_datasource_and_sheet(self) -> None: + output = instantiate_resource( + datasource_definition_path=FIXTURES / "target-datasource.xml", + output_path=self.tmp / "starter-output.twb", + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings={ + "ARR": "Revenue", + "Close Date": "Transaction Date", + "Product": "Offering", + }, + parameters={ + "DATE_MIN": "2026-01-01", + "DATE_MAX": "2026-06-30", + "DIRECTION": "DESC", + }, + ) + root = ET.fromstring(output) + self.assertEqual(len(root.find("datasources")), 1) + self.assertEqual(len(root.find("worksheets")), 1) + self.assertEqual(len(root.find("windows")), 1) + +def test_existing_output_requires_overwrite(self) -> None: + output = self.tmp / "existing.twb" + output.write_text("do not replace") + with self.assertRaisesRegex(ResourceError, "--overwrite"): + atomic_write(output, "new", overwrite=False) + self.assertEqual(output.read_text(), "do not replace") +``` + +- [ ] **Step 2: Run workbook tests and verify they fail** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_tableau_resources_workbook.py -v +``` + +Expected: FAIL because workbook transformation functions do not exist. + +- [ ] **Step 3: Implement datasource inspection and validation** + +`inspect_datasources` parses global workbook `` and returns each +datasource internal name with column names from descendant `` nodes. +Before rendering, verify the chosen datasource exists and every target field +mapping exists in it. + +For `instantiate`, require `--datasource-definition` to parse as exactly one +`` element with a nonempty `name`; reject documents with a +`` root or multiple datasource elements. + +- [ ] **Step 4: Implement bounded insertion** + +`inject_fragments` verifies exactly one closing `` and one closing +``, rejects duplicate worksheet/window names, inserts the worksheet +and window immediately before those closing tags, and leaves all preceding and +following bytes unchanged. + +For `instantiate`, insert the caller-supplied datasource immediately before +the starter's ``, then use the same fragment injection path. + +- [ ] **Step 5: Implement atomic output and CLI commands** + +Write output to `tempfile.NamedTemporaryFile` in the destination directory, +flush and `os.fsync`, then use `os.replace`. Remove the temporary file on every +exception. Refuse an existing destination unless `--overwrite` is present. +Require input and output paths to differ unless `--overwrite` is present. + +CLI examples: + +```bash +python3 plugins/tableau/scripts/tableau_resources.py inject \ + insights__line_chart \ + --input workbook.twb \ + --output workbook-with-trend.twb \ + --worksheet-name "ARR Trend" \ + --datasource "Sales Data" \ + --map "ARR=Revenue" \ + --map "Close Date=Transaction Date" + +python3 plugins/tableau/scripts/tableau_resources.py instantiate \ + insights__bar_chart \ + --datasource-definition datasource.xml \ + --output starter-bar.twb \ + --worksheet-name "ARR by Offering" \ + --map "ARR=Revenue" \ + --map "Close Date=Transaction Date" \ + --map "Product=Offering" \ + --param "DATE_MIN=2026-01-01" \ + --param "DATE_MAX=2026-06-30" \ + --param "DIRECTION=DESC" +``` + +- [ ] **Step 6: Run workbook tests** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_tableau_resources_workbook.py -v +``` + +Expected: PASS with input-preservation, starter, and overwrite tests. + +### Task 6: Add fail-closed workbook validation + +**Files:** +- Modify: `plugins/tableau/scripts/tableau_resources.py` +- Create: `plugins/tableau/tests/test_tableau_resources_validation.py` + +**Interfaces:** +- Produces `validate_workbook_text(text: str) -> list[str]`. +- Produces `validate_workbook(path: Path) -> list[str]`. +- CLI command `validate --input ` exits 0 for no errors and 1 with JSON errors otherwise. + +- [ ] **Step 1: Write failing validation and failure-atomicity tests** + +```python +def test_validate_rejects_unresolved_tokens(self) -> None: + path = self.tmp / "tokens.twb" + path.write_text("{{field_base_1}}") + self.assertIn("unresolved-template-token", validate_workbook(path)) + +def test_validate_rejects_missing_datasource_reference(self) -> None: + path = self.tmp / "missing-ds.twb" + path.write_text( + "
" + "[Missing].[none:Category:nk]
" + "" + ) + self.assertIn("unknown-datasource-reference: Missing", validate_workbook(path)) + +def test_failed_injection_creates_no_partial_output(self) -> None: + output = self.tmp / "partial.twb" + with self.assertRaises(ResourceError): + inject_resource( + input_path=FIXTURES / "existing-workbook.twb", + output_path=output, + resource_id="insights__bar_chart", + worksheet_name="Broken", + datasource_name="Sales Data", + field_mappings={}, + parameters={}, + ) + self.assertFalse(output.exists()) +``` + +- [ ] **Step 2: Run validation tests and verify they fail** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_tableau_resources_validation.py -v +``` + +Expected: FAIL because `validate_workbook` does not exist. + +- [ ] **Step 3: Implement ordered validation rules** + +Return stable, deduplicated error strings in this order: + +1. `malformed-xml` +2. `not-tableau-workbook` +3. `missing-datasources-container` +4. `missing-worksheets-container` +5. `missing-windows-container` +6. `unresolved-template-token` +7. `unresolved-federated-placeholder` +8. `duplicate-worksheet-name: ` +9. `duplicate-window-name: ` +10. `worksheet-window-name-mismatch: ` +11. `unknown-datasource-reference: ` +12. `unknown-field-reference: .` + +Datasource and field validation uses definitions from global datasources and +worksheet-local datasource dependencies. Ignore Tableau pseudo-fields that +start with `:` and generated Latitude/Longitude fields. + +- [ ] **Step 4: Make instantiate and inject validate before atomic write** + +If `validate_workbook_text(output)` returns errors, raise: + +```text +Generated workbook failed validation: +``` + +Do not create or replace the destination. + +- [ ] **Step 5: Run all CLI tests** + +Run: + +```bash +python3 -m unittest discover -s plugins/tableau/tests -p "test_*.py" -v +``` + +Expected: all tests pass with zero failures. + +### Task 7: Expose resources through Codex skills + +**REQUIRED SUB-SKILL:** Use superpowers:writing-skills for the two new skills +and the validation-skill edit. + +**Files:** +- Create: `plugins/tableau/skills/tableau-workbook-authoring/SKILL.md` +- Create: `plugins/tableau/skills/tableau-workbook-authoring/references/resource-guide.md` +- Create: `plugins/tableau/skills/tableau-pulse-insights/SKILL.md` +- Modify: `plugins/tableau/skills/validate-workbook-package/SKILL.md` +- Modify: `plugins/tableau/.codex-plugin/plugin.json` +- Create: `plugins/tableau/README.md` +- Modify: `README.md` +- Test: `plugins/tableau/tests/test_skill_resource_contract.py` + +**Interfaces:** +- Main skill invokes CLI by path relative to its own directory: + `../../scripts/tableau_resources.py`. +- Pulse skill uses catalog family `pulse-insights`. +- Validation skill remains the pre-publish gate. + +- [ ] **Step 1: Write the failing skill contract test** + +```python +class SkillResourceContractTest(unittest.TestCase): + def test_skill_entry_points_and_cli_references_exist(self) -> None: + for skill_name in ("tableau-workbook-authoring", "tableau-pulse-insights"): + path = PLUGIN / "skills" / skill_name / "SKILL.md" + text = path.read_text() + self.assertIn(f"name: {skill_name}", text) + self.assertIn("../../scripts/tableau_resources.py", text) + authoring = ( + PLUGIN / "skills/tableau-workbook-authoring/SKILL.md" + ).read_text() + for command in ("list", "inspect", "instantiate", "inject", "validate"): + self.assertIn(f" {command}", authoring) + + def test_plugin_prompts_surface_template_authoring(self) -> None: + plugin = json.loads((PLUGIN / ".codex-plugin/plugin.json").read_text()) + prompts = plugin["interface"]["defaultPrompt"] + self.assertIn("Build a Tableau workbook from a template", prompts) +``` + +- [ ] **Step 2: Run the skill contract test and verify it fails** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_skill_resource_contract.py -v +``` + +Expected: FAIL because the two entry-point skills do not exist. + +- [ ] **Step 3: Author the workbook skill** + +Frontmatter: + +```yaml +--- +name: tableau-workbook-authoring +description: Use when creating, modifying, templating, validating, or publishing Tableau .twb workbooks, including selecting visualization samples and mapping fields into Tableau bookmark templates. +--- +``` + +The workflow must require: + +1. Inspect an existing workbook or prepare a datasource definition. +2. Run `list` before choosing a chart. +3. Run `inspect` before mapping fields. +4. Use `inject` for existing workbooks and `instantiate` for the starter. +5. Treat reference-only resources as inspiration, never executable input. +6. Run local `validate`. +7. Run `validate-workbook-package`. +8. Publish only with the returned validation receipt. + +Put detailed CLI examples, mapping syntax, and failure recovery in +`references/resource-guide.md`, not in the always-loaded skill body. + +- [ ] **Step 4: Author the Pulse Insights skill** + +Frontmatter: + +```yaml +--- +name: tableau-pulse-insights +description: Use when building Tableau Pulse Insights bar or line visualizations in a .twb workbook, including ARR trends, ranked products, date ranges, and field mapping. +--- +``` + +The skill must begin discovery with: + +```bash +python3 ../../scripts/tableau_resources.py list \ + --family pulse-insights \ + --tier executable +``` + +It must delegate transformation and validation rules to the workbook +authoring skill and shared CLI rather than duplicating them. + +- [ ] **Step 5: Connect validation and plugin install-surface copy** + +Add a short prerequisite to `validate-workbook-package` explaining that local +resource validation occurs before packaging. + +Update plugin prompts to: + +```json +[ + "Build a Tableau workbook from a template", + "Create a Tableau Pulse Insights visualization", + "Validate and publish this Tableau workbook" +] +``` + +Update plugin and root READMEs with resource tiers, CLI location, and the +download-or-starter → transform → validate → publish flow. + +- [ ] **Step 6: Run skill and full tests** + +Run: + +```bash +python3 -m unittest discover -s plugins/tableau/tests -p "test_*.py" -v +python3 plugins/tableau/scripts/generate_resource_catalog.py \ + --plugin-root plugins/tableau \ + --check +python3 plugins/tableau/scripts/tableau_resources.py list \ + --family pulse-insights \ + --tier executable +``` + +Expected: + +- All unit tests pass. +- Catalog check exits 0 without rewriting files. +- Discovery returns exactly `insights__bar_chart` and + `insights__line_chart`. + +### Task 8: Run end-to-end golden workflows + +**Files:** +- Create: `plugins/tableau/tests/test_end_to_end_resources.py` +- Create: `plugins/tableau/tests/golden/insights-bar.twb` +- Create: `plugins/tableau/tests/golden/insights-line-injected.twb` + +**Interfaces:** +- Verifies the public CLI only; does not import private implementation helpers. + +- [ ] **Step 1: Write end-to-end subprocess tests** + +The tests execute: + +1. `instantiate insights__bar_chart` against `target-datasource.xml`. +2. `validate` the generated workbook. +3. `inject insights__line_chart` into `existing-workbook.twb`. +4. `validate` the injected workbook. +5. Compare normalized line endings to checked-in golden files. +6. Assert input fixture hashes are unchanged. + +- [ ] **Step 2: Run end-to-end tests and verify they fail before golden files** + +Run: + +```bash +python3 -m unittest plugins/tableau/tests/test_end_to_end_resources.py -v +``` + +Expected: FAIL because golden files do not exist. + +- [ ] **Step 3: Generate and review golden files** + +Generate golden files only through the public CLI commands from Task 5. +Manually verify: + +- Correct datasource and target field names. +- No donor names or unresolved tokens. +- One worksheet and matching window per generated resource. +- Existing workbook marker and unrelated bytes remain unchanged. + +- [ ] **Step 4: Run final verification** + +Run: + +```bash +python3 -m unittest discover -s plugins/tableau/tests -p "test_*.py" -v +python3 plugins/tableau/scripts/generate_resource_catalog.py \ + --plugin-root plugins/tableau \ + --check +python3 plugins/tableau/scripts/tableau_resources.py validate \ + --input plugins/tableau/tests/golden/insights-bar.twb +python3 plugins/tableau/scripts/tableau_resources.py validate \ + --input plugins/tableau/tests/golden/insights-line-injected.twb +git diff --check +``` + +Expected: every command exits 0, the test suite reports zero failures, both +golden workbooks validate, and `git diff --check` reports no whitespace errors. + diff --git a/docs/superpowers/specs/2026-08-18-tableau-plugin-resources-design.md b/docs/superpowers/specs/2026-08-18-tableau-plugin-resources-design.md new file mode 100644 index 0000000..a81cb48 --- /dev/null +++ b/docs/superpowers/specs/2026-08-18-tableau-plugin-resources-design.md @@ -0,0 +1,222 @@ +# Tableau Plugin Resources Design + +## Goal + +Make the Tableau samples, bookmark templates, XML examples, and reference +corpora discoverable to Codex and make a safe subset deterministically +executable against Tableau workbook files. + +Codex will not depend on the Tableau Desktop external client API. It will +either download and modify an existing `.twb` or create one from a starter, +validate the resulting workbook package, and publish it through Tableau's +existing publish API. + +## Architecture + +The plugin will use a tiered hybrid model: + +1. Every resource is indexed and available as reference material. +2. Templates that pass static portability checks are executable. +3. Templates with inline donor connections, unsupported calculations, viz + extensions, or unresolved references remain inspiration-only. + +```mermaid +flowchart TD + A[Codex loads Tableau skill] + B[Search resource catalog] + C{Resource tier} + D[Read reference resource] + E[Inspect executable contract] + F[Map datasource fields and parameters] + G[Create or inject TWB] + H[Validate and publish] + A --> B --> C + C --> D + C --> E --> F --> G --> H +``` + +The plugin manifest continues to expose `skills` and the hosted Tableau MCP +server. Codex plugin manifests do not provide a generic `data` discovery +surface, so skills are the entry points and a bundled CLI is the execution +surface. + +## Package structure + +```text +plugins/tableau/ + resources/ + catalog.json + templates/ + executable/ + reference/ + examples/ + references/ + starters/ + minimal-workbook.twb + scripts/ + tableau_resources.py + generate_resource_catalog.py + skills/ + tableau-workbook-authoring/ + SKILL.md + references/ + resource-guide.md + tableau-pulse-insights/ + SKILL.md + validate-workbook-package/ + SKILL.md +``` + +The current `data/templates`, `data/examples`, and root JSON files will move +into the corresponding `resources` directories. The two upstream +`insights__bar_chart.tbm` and `insights__line_chart.tbm` bookmarks will be +added with recorded source provenance. + +## Resource catalog + +`resources/catalog.json` is generated, checked into the repository, and used +by both skills and scripts. It contains: + +- Catalog schema version. +- Upstream repository, branch or tag, and source commit. +- Resource ID, type, family, intent, relative path, and keywords. +- `reference` or `executable` tier with classification reasons. +- Donor datasource names. +- Required and optional field slots, including datatype, role, derivation, + shelf placement, and source field. +- Explicit template parameters such as `DATE_MIN`, `DATE_MAX`, and + `DIRECTION`. +- Integrity hash for every source file. + +The generator derives facts from file contents rather than template names +where possible. File names provide discovery keywords and intent, not runtime +field semantics. + +## Discoverability + +`tableau-workbook-authoring` is the main skill for creating, modifying, and +publishing `.twb` workbooks. It instructs Codex to: + +1. Inspect or create the target workbook. +2. Search the resource catalog before hand-authoring a visualization. +3. Use reference resources for patterns and executable resources for + deterministic generation. +4. Validate the resulting package before publishing. + +`tableau-pulse-insights` is a focused entry point for Pulse Insights chart +requests. It filters the shared catalog to the two `insights__` resources and +then uses the same execution CLI. It does not duplicate templates or runtime +logic. + +The existing validation skill remains the final pre-publish gate. + +## Execution CLI + +`scripts/tableau_resources.py` uses the Python standard library and exposes: + +- `list`: search by text, family, resource type, or tier. +- `inspect`: print the selected resource's field and parameter contract. +- `instantiate`: create a workbook from the starter, a caller-supplied + `` definition, and one executable template. +- `inject`: add an executable template to an existing `.twb`. +- `validate`: check a generated `.twb` before package validation. + +The CLI accepts explicit datasource, field, and parameter mappings. It never +guesses a field from its caption and never overwrites an input workbook unless +the caller supplies an explicit overwrite flag. Default behavior writes a new +output file. + +For an existing workbook, the CLI reads available datasource and field +metadata from the `.twb`, verifies every required mapping, transforms the +bookmark into worksheet and window fragments, rewrites donor references, and +inserts the fragments without reserializing the rest of the workbook. + +For a new workbook, the starter supplies a valid workbook shell. +`instantiate` requires `--datasource-definition ` containing exactly one +valid Tableau `` element. The CLI inserts that element, reads its +fields for mapping validation, and will not fabricate connection metadata. + +## Executable eligibility + +A template is executable only when automated checks establish that it: + +- Is a well-formed Tableau bookmark with one worksheet table and window. +- Uses one donor datasource whose references can be rewritten. +- Has complete column metadata for every placed field. +- Has no inline connection or embedded extract dependency. +- Has no unsupported viz extension. +- Has no calculation dependency outside the inferred field contract. +- Has no unresolved bare field reference after tokenization. +- Produces a well-formed worksheet/window pair in a golden fixture. + +Passing these rules, rather than belonging to the lean naming cohort, grants +executable status. The large `family__chart__intent` bookmarks remain +reference-only unless they independently pass. + +## Workbook transformation safety + +The CLI parses XML to inspect and validate structure but uses bounded text +splices for insertion so it does not rewrite unrelated Tableau XML, +namespaces, formatting, or unknown elements. + +Before writing output it verifies: + +- The input is a Tableau workbook with worksheet and window containers. +- The target datasource exists. +- Every required source field and parameter has one mapping. +- The output worksheet name is unique or explicitly renamed. +- No `{{...}}`, `federated.XXXX`, or donor datasource references remain. +- Every datasource-qualified field reference resolves to the selected target + datasource. +- The output is well-formed XML and the input file remains unchanged. + +On failure, the CLI exits nonzero, reports the exact missing mapping or +structural condition, and does not create a partial output. + +## Publish handoff + +Publishing remains outside the resource CLI: + +1. Codex creates or downloads a workspace and `.twb`. +2. The resource CLI modifies a copy. +3. The existing package-validation workflow validates the `.twbx` receipt. +4. Codex passes that receipt to Tableau's create-and-publish API. + +This keeps resource execution deterministic and local while authentication, +packaging, and publishing remain owned by Tableau services. + +## Testing + +Tests will cover: + +- Catalog generation, deterministic ordering, integrity hashes, and provenance. +- Classification reasons for executable and reference-only templates. +- Search and inspection output. +- Field, datasource, derivation, and parameter mapping validation. +- Golden output for a portable bar template and both Pulse Insights templates. +- Injection into an existing workbook without changing unrelated bytes. +- Starter workbook generation. +- Duplicate worksheet names, missing containers, malformed XML, unsupported + templates, unresolved tokens, and incomplete mappings. +- Input preservation and no partial output on every failure path. +- Catalog drift detection so resource changes require regeneration. + +## Out of scope + +- Tableau Desktop or its external client API. +- Reimplementing the complete Tableau MCP bookmark compiler. +- Executing every large inline-datasource bookmark in the first release. +- Generating datasource connection metadata without caller input. +- Publishing directly from the resource CLI. + +## Success criteria + +1. Codex discovers the authoring and Pulse skills from this plugin. +2. A catalog query returns relevant samples and templates without scanning all + resource files. +3. Codex can inspect any resource as inspiration. +4. Codex can create or inject each eligible template with explicit mappings. +5. Generated workbooks pass local structural validation and the existing + package-validation workflow. +6. Reference-only templates fail closed with a clear classification reason. + diff --git a/plugins/tableau/.codex-plugin/plugin.json b/plugins/tableau/.codex-plugin/plugin.json index 7bf67da..e896496 100644 --- a/plugins/tableau/.codex-plugin/plugin.json +++ b/plugins/tableau/.codex-plugin/plugin.json @@ -28,9 +28,9 @@ ], "websiteURL": "https://www.tableau.com", "defaultPrompt": [ - "Analyze this data with Tableau", - "Help me build a Tableau visualization", - "Validate this Tableau workbook package" + "Build a Tableau workbook from a template", + "Create a Tableau Pulse Insights visualization", + "Validate and publish this Tableau workbook" ] } } diff --git a/plugins/tableau/README.md b/plugins/tableau/README.md new file mode 100644 index 0000000..affe9f2 --- /dev/null +++ b/plugins/tableau/README.md @@ -0,0 +1,55 @@ +# Tableau Plugin + +Teaches Codex to analyze data, build and modify Tableau `.twb` workbooks +from a curated resource catalog, validate workbook packages, and use the +hosted Tableau MCP server. + +## Skills + +- `tableau-workbook-authoring` — build, edit, template, and validate `.twb` + workbooks using the resource catalog and CLI. +- `tableau-pulse-insights` — build Pulse Insights bar/line visualizations + (ARR trends, ranked products) using the `pulse-insights` catalog family. +- `validate-workbook-package` — the pre-publish validation gate. + +## Resource catalog and CLI + +`resources/catalog.json` indexes every chart template, worked example, and +reference document under `resources/`. Each entry declares a `tier`: + +- `executable` — a bookmark template that `instantiate`/`inject` can + render into a real worksheet and window, with a typed field-mapping and + parameter contract. +- `reference` — a worked example, corpus entry, or schema document to + study, never to render directly. + +The CLI, `scripts/tableau_resources.py`, is the only supported way to +discover and transform these resources: + +```bash +python3 scripts/tableau_resources.py list --tier executable +python3 scripts/tableau_resources.py inspect +python3 scripts/tableau_resources.py instantiate \ + --datasource-definition --output --worksheet-name \ + --map SOURCE=TARGET --param NAME=VALUE +python3 scripts/tableau_resources.py inject \ + --input --output --datasource \ + --worksheet-name --map SOURCE=TARGET --param NAME=VALUE +python3 scripts/tableau_resources.py validate --input +``` + +## Authoring flow + +1. **Download-or-starter** — inspect an existing workbook's datasources, or + prepare a `` definition for a new one built from + `resources/starters/minimal-workbook.twb`. +2. **Transform** — `list` and `inspect` a catalog resource, then + `instantiate` (new workbook) or `inject` (existing workbook) it with the + required field mappings and parameters. +3. **Validate** — run the CLI's `validate` locally, then run + `validate-workbook-package` as the pre-publish gate. +4. **Publish** — call `create-and-publish-workbook` with the validation + receipt `validate-workbook-package` returned. + +See `skills/tableau-workbook-authoring/references/resource-guide.md` for +full CLI flags, mapping syntax, and failure recovery. diff --git a/plugins/tableau/resources/catalog-overrides.json b/plugins/tableau/resources/catalog-overrides.json new file mode 100644 index 0000000..6e04648 --- /dev/null +++ b/plugins/tableau/resources/catalog-overrides.json @@ -0,0 +1,23 @@ +{ + "schemaVersion": 1, + "resources": { + "insights__bar_chart": { + "family": "pulse-insights", + "intent": "Rank products by ARR within a date range", + "parameters": { + "DATE_MIN": {"type": "date", "required": true}, + "DATE_MAX": {"type": "date", "required": true}, + "DIRECTION": { + "type": "enum", + "required": true, + "allowed": ["ASC", "DESC"] + } + } + }, + "insights__line_chart": { + "family": "pulse-insights", + "intent": "Show ARR over close date with a trend line", + "parameters": {} + } + } +} diff --git a/plugins/tableau/resources/catalog.json b/plugins/tableau/resources/catalog.json new file mode 100644 index 0000000..1fc94de --- /dev/null +++ b/plugins/tableau/resources/catalog.json @@ -0,0 +1,9514 @@ +{ + "schemaVersion": 1, + "generatedFrom": { + "provenance": "./provenance.json", + "overrides": "./catalog-overrides.json" + }, + "resources": [ + { + "id": "box-plot-chart", + "type": "template", + "family": null, + "intent": "box plot chart", + "path": "./templates/executable/box-plot-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "box", + "chart", + "executable", + "plot", + "template" + ], + "sha256": "ff857d1b1dc998b5abb052ad37b366070b28258ad9cf2e7e110eef35d2feb177" + }, + { + "id": "bullet-variance-chart", + "type": "template", + "family": null, + "intent": "bullet variance chart", + "path": "./templates/executable/bullet-variance-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + } + ], + "parameters": [], + "keywords": [ + "bullet", + "chart", + "executable", + "template", + "variance" + ], + "sha256": "110108cadf3d0a94fd47cbaa642abe3f892dc1247fe2c2092b9fa63dc53fbe19" + }, + { + "id": "calculated-field", + "type": "example", + "family": null, + "intent": "calculated field", + "path": "./examples/calculated-field.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "calculated", + "example", + "field" + ], + "sha256": "7b6c4094dbfdce0b6d175ac29174fc278c25a1a86f042e938ed7a6201516cc07" + }, + { + "id": "change-over-time-area-chart", + "type": "template", + "family": null, + "intent": "change over time area chart", + "path": "./templates/executable/change-over-time-area-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "area", + "change", + "chart", + "executable", + "over", + "template", + "time" + ], + "sha256": "4586e8265f3030633d19925f0fd9716296069cab5f9afdf4a25c77218012ec8b" + }, + { + "id": "change-over-time-calendar-heatmap", + "type": "template", + "family": null, + "intent": "change over time calendar heatmap", + "path": "./templates/executable/change-over-time-calendar-heatmap.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "calendar", + "change", + "executable", + "heatmap", + "over", + "template", + "time" + ], + "sha256": "e27d67feff12c12cee6fd9a9550e744e17f163a7b04cbacb631ad7840877299a" + }, + { + "id": "change-over-time-stacked-area-chart", + "type": "template", + "family": null, + "intent": "change over time stacked area chart", + "path": "./templates/executable/change-over-time-stacked-area-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "area", + "change", + "chart", + "executable", + "over", + "stacked", + "template", + "time" + ], + "sha256": "bb3dcbeb826bc764ec6b209583af0e30430f66d254d544fb3c1007c1f2dc4fde" + }, + { + "id": "change-over-time__area__emphasize-total-change-more-than-parts", + "type": "template", + "family": "change-over-time", + "intent": "emphasize total change more than parts", + "path": "./templates/reference/change-over-time__area__emphasize-total-change-more-than-parts.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "area", + "change", + "emphasize", + "more", + "over", + "parts", + "reference", + "template", + "than", + "time", + "total" + ], + "sha256": "dfac800e3b0b273111025e90c5c82d24f681a71709c1c7873190def35aa7d6f4" + }, + { + "id": "change-over-time__calendar-heatmap__reveal-daily-weekly-seasonal-patterns", + "type": "template", + "family": "change-over-time", + "intent": "reveal daily weekly seasonal patterns", + "path": "./templates/reference/change-over-time__calendar-heatmap__reveal-daily-weekly-seasonal-patterns.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "rows" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "calendar", + "change", + "daily", + "heatmap", + "over", + "patterns", + "reference", + "reveal", + "seasonal", + "template", + "time", + "weekly" + ], + "sha256": "23c98217f75c4a310dfb49ff966023e452a90141d11e7173663bdef3c3daede8" + }, + { + "id": "change-over-time__candlestick__show-open-high-low-close-activity", + "type": "template", + "family": "change-over-time", + "intent": "show open high low close activity", + "path": "./templates/reference/change-over-time__candlestick__show-open-high-low-close-activity.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0q5aijb1kryaw91eb1rim0uwj8p5" + ], + "fields": [ + { + "sourceField": "Calculation_3464112593743679493", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_3464112593743745030", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Close", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Date", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "date", + "role": "dimension", + "derivation": "Day-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Date", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "date", + "role": "dimension", + "derivation": "Day", + "shelf": "filters" + }, + { + "sourceField": "High", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Low", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Low", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Open", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Open", + "datasource": "federated.0q5aijb1kryaw91eb1rim0uwj8p5", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "activity", + "candlestick", + "change", + "close", + "high", + "low", + "open", + "over", + "reference", + "show", + "template", + "time" + ], + "sha256": "334ce7cde0d61a0c0670b9ac4e8bd5e65f4c9fe8f852fd178ec44c3f16e1e9a2" + }, + { + "id": "change-over-time__circle-timeline__show-sized-events-across-time-and-categories", + "type": "template", + "family": "change-over-time", + "intent": "show sized events across time and categories", + "path": "./templates/reference/change-over-time__circle-timeline__show-sized-events-across-time-and-categories.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month-Trunc", + "shelf": "marks" + }, + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "across", + "and", + "categories", + "change", + "circle", + "events", + "over", + "reference", + "show", + "sized", + "template", + "time", + "timeline" + ], + "sha256": "eaeded9c5d96d55d1be24bf9247be5e771016a5a9e0c01cd883aed94277013d9" + }, + { + "id": "change-over-time__column__show-one-series-changing-across-periods", + "type": "template", + "family": "change-over-time", + "intent": "show one series changing across periods", + "path": "./templates/reference/change-over-time__column__show-one-series-changing-across-periods.tbm", + "tier": "reference", + "classificationReasons": [ + "inline-datasource" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Region", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "across", + "change", + "changing", + "column", + "one", + "over", + "periods", + "reference", + "series", + "show", + "template", + "time" + ], + "sha256": "cb946f3e4157db4a2a78866ec6ada99f8b3784d330587ae72051c69ca3836d08" + }, + { + "id": "change-over-time__connected-scatter__trace-two-metrics-evolving-together", + "type": "template", + "family": "change-over-time", + "intent": "trace two metrics evolving together", + "path": "./templates/reference/change-over-time__connected-scatter__trace-two-metrics-evolving-together.tbm", + "tier": "reference", + "classificationReasons": [ + "inline-datasource" + ], + "datasources": [ + "World Indicators" + ], + "fields": [ + { + "sourceField": "Country/Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Internet Usage", + "datasource": "World Indicators", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Year", + "datasource": "World Indicators", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "change", + "connected", + "evolving", + "metrics", + "over", + "reference", + "scatter", + "template", + "time", + "together", + "trace", + "two" + ], + "sha256": "59b48a8d426d7d8d29757147249aa9627a089f2f143836e3f2272218ac4cac53" + }, + { + "id": "change-over-time__dual-line__compare-two-time-series-directly", + "type": "template", + "family": "change-over-time", + "intent": "compare two time series directly", + "path": "./templates/reference/change-over-time__dual-line__compare-two-time-series-directly.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1778077472749178880", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1778077472749178880", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Calculation_1992279925712498703", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1992279925712498703", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "change", + "compare", + "directly", + "dual", + "line", + "over", + "reference", + "series", + "template", + "time", + "two" + ], + "sha256": "f5b372f042b9aec28b849fa82f712b236bd8e9326bc04f57c2a8c71f6ed84ac4" + }, + { + "id": "change-over-time__fan__show-forecast-uncertainty-widening-over-time", + "type": "template", + "family": "change-over-time", + "intent": "show forecast uncertainty widening over time", + "path": "./templates/reference/change-over-time__fan__show-forecast-uncertainty-widening-over-time.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Sub-Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "change", + "fan", + "forecast", + "over", + "reference", + "show", + "template", + "time", + "uncertainty", + "widening" + ], + "sha256": "daee5c2f3e501ce8ce666122916aa00dc98b836d8e7514e259811e055c582d1b" + }, + { + "id": "change-over-time__gantt__show-start-duration-and-overlap-of-tasks", + "type": "template", + "family": "change-over-time", + "intent": "show start duration and overlap of tasks", + "path": "./templates/reference/change-over-time__gantt__show-start-duration-and-overlap-of-tasks.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_3464112593783345164", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Calculation_3464112593784180750", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Late? (copy)_3464112593785438223", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Day-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "and", + "change", + "duration", + "gantt", + "of", + "over", + "overlap", + "reference", + "show", + "start", + "tasks", + "template", + "time" + ], + "sha256": "583db2bb90178373f9da0a85f283b8a81267455b76ec43eb9dc9a2f8744b0f42" + }, + { + "id": "change-over-time__line-plus-area__combine-trend-line-with-filled-volume", + "type": "template", + "family": "change-over-time", + "intent": "combine trend line with filled volume", + "path": "./templates/reference/change-over-time__line-plus-area__combine-trend-line-with-filled-volume.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1778077472749178880", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1778077472749178880", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Calculation_1992279925712498703", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1992279925712498703", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "area", + "change", + "combine", + "filled", + "line", + "over", + "plus", + "reference", + "template", + "time", + "trend", + "volume", + "with" + ], + "sha256": "10294672139c42b8a27c6c99e9f9e0d9074c7da5763d92902c0d15bda0140641" + }, + { + "id": "change-over-time__line-plus-column__pair-volume-columns-with-a-rate-line", + "type": "template", + "family": "change-over-time", + "intent": "pair volume columns with a rate line", + "path": "./templates/reference/change-over-time__line-plus-column__pair-volume-columns-with-a-rate-line.tbm", + "tier": "reference", + "classificationReasons": [ + "inline-datasource" + ], + "datasources": [ + "World Indicators" + ], + "fields": [ + { + "sourceField": "CO2 Emissions", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "CO2 Emissions", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "CO2 Emissions", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Country/Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Year", + "datasource": "World Indicators", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Year", + "datasource": "World Indicators", + "datatype": "date", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "a", + "change", + "column", + "columns", + "line", + "over", + "pair", + "plus", + "rate", + "reference", + "template", + "time", + "volume", + "with" + ], + "sha256": "1065db026eaf454f20f93eee2f81a4f9686eb731befd9e836ad25af0a3598de1" + }, + { + "id": "change-over-time__line__default-time-series-trend", + "type": "template", + "family": "change-over-time", + "intent": "default time series trend", + "path": "./templates/reference/change-over-time__line__default-time-series-trend.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "change", + "default", + "line", + "over", + "reference", + "series", + "template", + "time", + "trend" + ], + "sha256": "f55d8285a965932dff83b77b07bfd5cd1e7ddbbe1c7b8cc216e848b7e89d517e" + }, + { + "id": "change-over-time__multi-line__compare-many-series-with-optional-highlight", + "type": "template", + "family": "change-over-time", + "intent": "compare many series with optional highlight", + "path": "./templates/reference/change-over-time__multi-line__compare-many-series-with-optional-highlight.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource", + "missing-column-metadata" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Sub-Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "change", + "compare", + "highlight", + "line", + "many", + "multi", + "optional", + "over", + "reference", + "series", + "template", + "time", + "with" + ], + "sha256": "0651ba09d19615d7e8de9debf020cd1388095f98650f6543b23357903161f435" + }, + { + "id": "change-over-time__ohlc__show-open-close-and-high-low-ranges", + "type": "template", + "family": "change-over-time", + "intent": "show open close and high low ranges", + "path": "./templates/reference/change-over-time__ohlc__show-open-close-and-high-low-ranges.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0mr55js0pwmp4611a4sho0rbgmji" + ], + "fields": [ + { + "sourceField": "Calculation_2455446972500406272", + "datasource": "federated.0mr55js0pwmp4611a4sho0rbgmji", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Close", + "datasource": "federated.0mr55js0pwmp4611a4sho0rbgmji", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "rows" + }, + { + "sourceField": "Date", + "datasource": "federated.0mr55js0pwmp4611a4sho0rbgmji", + "datatype": "date", + "role": "dimension", + "derivation": "Day-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Date", + "datasource": "federated.0mr55js0pwmp4611a4sho0rbgmji", + "datatype": "date", + "role": "dimension", + "derivation": "MY", + "shelf": "filters" + }, + { + "sourceField": "Low", + "datasource": "federated.0mr55js0pwmp4611a4sho0rbgmji", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "rows" + }, + { + "sourceField": "Stock", + "datasource": "federated.0mr55js0pwmp4611a4sho0rbgmji", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "and", + "change", + "close", + "high", + "low", + "ohlc", + "open", + "over", + "ranges", + "reference", + "show", + "template", + "time" + ], + "sha256": "b4144db98c53a80b75afe64c22181e007e11f6ee3eadff0fb85e4b5987f68720" + }, + { + "id": "change-over-time__priestley-timeline__show-date-and-duration-of-intervals", + "type": "template", + "family": "change-over-time", + "intent": "show date and duration of intervals", + "path": "./templates/reference/change-over-time__priestley-timeline__show-date-and-duration-of-intervals.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0gx040s1dzf8p31bd8azb1ew2wy2" + ], + "fields": [ + { + "sourceField": "Calculation_4533013781878091776", + "datasource": "federated.0gx040s1dzf8p31bd8azb1ew2wy2", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "born", + "datasource": "federated.0gx040s1dzf8p31bd8azb1ew2wy2", + "datatype": "date", + "role": "dimension", + "derivation": "Day-Trunc", + "shelf": "columns" + }, + { + "sourceField": "born", + "datasource": "federated.0gx040s1dzf8p31bd8azb1ew2wy2", + "datatype": "date", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "died", + "datasource": "federated.0gx040s1dzf8p31bd8azb1ew2wy2", + "datatype": "date", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "name", + "datasource": "federated.0gx040s1dzf8p31bd8azb1ew2wy2", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "name", + "datasource": "federated.0gx040s1dzf8p31bd8azb1ew2wy2", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "name", + "datasource": "federated.0gx040s1dzf8p31bd8azb1ew2wy2", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "and", + "change", + "date", + "duration", + "intervals", + "of", + "over", + "priestley", + "reference", + "show", + "template", + "time", + "timeline" + ], + "sha256": "97bf5c25a73df6037115f5a3ea0d1ebb183771c54228ed359aa2b977c6ce2210" + }, + { + "id": "change-over-time__seismogram__show-high-variance-series-as-mirrored-spikes", + "type": "template", + "family": "change-over-time", + "intent": "show high variance series as mirrored spikes", + "path": "./templates/reference/change-over-time__seismogram__show-high-variance-series-as-mirrored-spikes.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_3464112593755459591", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Calculation_3464112593755459591", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "rows" + }, + { + "sourceField": "Sales + (copy)_3464112593755500552", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "as", + "change", + "high", + "mirrored", + "over", + "reference", + "seismogram", + "series", + "show", + "spikes", + "template", + "time", + "variance" + ], + "sha256": "3b20790e034f014e82194e8083455b76b01e56954e934abd04b5cf259c1125d3" + }, + { + "id": "change-over-time__stacked-area__show-composition-changing-over-time", + "type": "template", + "family": "change-over-time", + "intent": "show composition changing over time", + "path": "./templates/reference/change-over-time__stacked-area__show-composition-changing-over-time.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "area", + "change", + "changing", + "composition", + "over", + "reference", + "show", + "stacked", + "template", + "time" + ], + "sha256": "a4025a06aa21c93bd9337424c68271fb5e4772006427348281cb2fb8888dbd4e" + }, + { + "id": "change-over-time__steamgraph__show-organic-stacked-flows-over-time", + "type": "template", + "family": "change-over-time", + "intent": "show organic stacked flows over time", + "path": "./templates/reference/change-over-time__steamgraph__show-organic-stacked-flows-over-time.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_3464112593758343177", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Sub-Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Sub-Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "change", + "flows", + "organic", + "over", + "reference", + "show", + "stacked", + "steamgraph", + "template", + "time" + ], + "sha256": "251b9fe0eb799806aa8e555b85efe12a20f725c5d3392220dea2328b88300914" + }, + { + "id": "column-instance-naming", + "type": "example", + "family": null, + "intent": "column instance naming", + "path": "./examples/column-instance-naming.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "column", + "example", + "instance", + "naming" + ], + "sha256": "507a8d02ff51d2eac33795d080e5b6c86cacfd721e24e4669f7619649bc7ba31" + }, + { + "id": "connected-scatterplot", + "type": "template", + "family": null, + "intent": "connected scatterplot", + "path": "./templates/reference/connected-scatterplot.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1368249927221915648", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "connected", + "reference", + "scatterplot", + "template" + ], + "sha256": "93c57345e8785bcc6d03dffb9782ddd01caa4927ef47b0f0e65569b14bfe5d12" + }, + { + "id": "control-chart-xmr", + "type": "template", + "family": null, + "intent": "control chart xmr", + "path": "./templates/reference/control-chart-xmr.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_20260705120000", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "MDY", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "chart", + "control", + "reference", + "template", + "xmr" + ], + "sha256": "bb85416c0711091f6a578203e5fea37582b4a1dc562dce17277105af12b7e0c5" + }, + { + "id": "corpus", + "type": "reference", + "family": null, + "intent": "corpus", + "path": "./references/corpus.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "corpus", + "reference" + ], + "sha256": "bf7f3fa5e72464c59edf239c9e18730d17affff0c13adc5f57ee540b7ecbdfcb" + }, + { + "id": "correlation-bubble-chart", + "type": "template", + "family": null, + "intent": "correlation bubble chart", + "path": "./templates/executable/correlation-bubble-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "rows" + }, + { + "sourceField": "Quantity", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "bubble", + "chart", + "correlation", + "executable", + "template" + ], + "sha256": "bf12267cb3ab28b42859644a4b88e829bf228427036988b42fd495ec3c34fcd2" + }, + { + "id": "correlation-dual-axis-chart", + "type": "template", + "family": null, + "intent": "correlation dual axis chart", + "path": "./templates/executable/correlation-dual-axis-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "axis", + "chart", + "correlation", + "dual", + "executable", + "template" + ], + "sha256": "492942f58909796d15ecbdfc65ce4244fdf82ef768bf4ddca6b940683dcb78cc" + }, + { + "id": "correlation-highlight-table", + "type": "template", + "family": null, + "intent": "correlation highlight table", + "path": "./templates/reference/correlation-highlight-table.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1368249927221915648", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "rows" + }, + { + "sourceField": "Sub-Category", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "correlation", + "highlight", + "reference", + "table", + "template" + ], + "sha256": "b6bf2b5ff5a6bbcf7b767bd4e2854c87b4bac939ccfdd35143a1d3fc8b307d25" + }, + { + "id": "correlation-scatter-plot-chart", + "type": "template", + "family": null, + "intent": "correlation scatter plot chart", + "path": "./templates/reference/correlation-scatter-plot-chart.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1368249927221915648", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "chart", + "correlation", + "plot", + "reference", + "scatter", + "template" + ], + "sha256": "df3a8f737ecb7537411efb202a2124ee4c8b9eccd58884c76c0277683006f00b" + }, + { + "id": "correlation__bubble-scatter__relate-two-measures-and-encode-a-third-by-size", + "type": "template", + "family": "correlation", + "intent": "relate two measures and encode a third by size", + "path": "./templates/reference/correlation__bubble-scatter__relate-two-measures-and-encode-a-third-by-size.tbm", + "tier": "reference", + "classificationReasons": [ + "inline-datasource" + ], + "datasources": [ + "World Indicators" + ], + "fields": [ + { + "sourceField": "CO2 Emissions", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "CO2 Emissions", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Population Total", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Year", + "datasource": "World Indicators", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "a", + "and", + "bubble", + "by", + "correlation", + "encode", + "measures", + "reference", + "relate", + "scatter", + "size", + "template", + "third", + "two" + ], + "sha256": "96305e4b8d100358750e759ea7ad8b619fca7332bca458dde77e9700debc18c7" + }, + { + "id": "correlation__category-heatmap__show-patterns-across-two-categorical-axes", + "type": "template", + "family": "correlation", + "intent": "show patterns across two categorical axes", + "path": "./templates/reference/correlation__category-heatmap__show-patterns-across-two-categorical-axes.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0y7zfam0ipwbfv122vvev1ykr655" + ], + "fields": [ + { + "sourceField": "Age Group", + "datasource": "federated.0y7zfam0ipwbfv122vvev1ykr655", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Est. Population", + "datasource": "federated.0y7zfam0ipwbfv122vvev1ykr655", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Income Bracket", + "datasource": "federated.0y7zfam0ipwbfv122vvev1ykr655", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "across", + "axes", + "categorical", + "category", + "correlation", + "heatmap", + "patterns", + "reference", + "show", + "template", + "two" + ], + "sha256": "4e4df7d10c198e4e2969de76c3b394cdf68142919f37edf578c61397c3f36f57" + }, + { + "id": "correlation__connected-scatter__show-how-two-metrics-move-together-over-time", + "type": "template", + "family": "correlation", + "intent": "show how two metrics move together over time", + "path": "./templates/reference/correlation__connected-scatter__show-how-two-metrics-move-together-over-time.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0bcq9g80509zc811j5es30x41zxx" + ], + "fields": [ + { + "sourceField": "Bottom 90%", + "datasource": "federated.0bcq9g80509zc811j5es30x41zxx", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Top 0.01%", + "datasource": "federated.0bcq9g80509zc811j5es30x41zxx", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Year", + "datasource": "federated.0bcq9g80509zc811j5es30x41zxx", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "connected", + "correlation", + "how", + "metrics", + "move", + "over", + "reference", + "scatter", + "show", + "template", + "time", + "together", + "two" + ], + "sha256": "70f9b5b20e8ab567f1e821e9c635d0e9c72683dee69dab3a203a5f888c8d60af" + }, + { + "id": "correlation__line-plus-column__relate-an-amount-series-to-a-rate-series", + "type": "template", + "family": "correlation", + "intent": "relate an amount series to a rate series", + "path": "./templates/reference/correlation__line-plus-column__relate-an-amount-series-to-a-rate-series.tbm", + "tier": "reference", + "classificationReasons": [ + "inline-datasource" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "a", + "amount", + "an", + "column", + "correlation", + "line", + "plus", + "rate", + "reference", + "relate", + "series", + "template", + "to" + ], + "sha256": "28dbb15c50beb316a30d514416d29becc39f688ebd2cc78763db3e004ded3c16" + }, + { + "id": "correlation__radar-profile__compare-multivariate-profiles", + "type": "template", + "family": "correlation", + "intent": "compare multivariate profiles", + "path": "./templates/reference/correlation__radar-profile__compare-multivariate-profiles.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0ekaykw02fhokp0zlnc6r075pqpt" + ], + "fields": [ + { + "sourceField": "Calculation_674414107008884736", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_674414107009298437", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Calculation_674414107009335302", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Metric", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Metric", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Percentile Rank", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "player", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "player", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "compare", + "correlation", + "multivariate", + "profile", + "profiles", + "radar", + "reference", + "template" + ], + "sha256": "8e927dd65fe41ccf165e913223e4363b6d1ba50c1bee315e3dea80cbb62cd54e" + }, + { + "id": "correlation__scatter__relate-two-continuous-measures", + "type": "template", + "family": "correlation", + "intent": "relate two continuous measures", + "path": "./templates/reference/correlation__scatter__relate-two-continuous-measures.tbm", + "tier": "reference", + "classificationReasons": [ + "inline-datasource" + ], + "datasources": [ + "World Indicators" + ], + "fields": [ + { + "sourceField": "CO2 Emissions", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "CO2 Emissions", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Year", + "datasource": "World Indicators", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "continuous", + "correlation", + "measures", + "reference", + "relate", + "scatter", + "template", + "two" + ], + "sha256": "1c31b6f5a06833979bb2262e069cd48a7a5900cbf5d1d9bef3152ce8c6ffa430" + }, + { + "id": "correlation__xy-heatmap__show-patterns-between-two-category-dimensions", + "type": "template", + "family": "correlation", + "intent": "show patterns between two category dimensions", + "path": "./templates/reference/correlation__xy-heatmap__show-patterns-between-two-category-dimensions.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.09c20je0q5g3r21bbot2n14oiosj" + ], + "fields": [ + { + "sourceField": "Age Range", + "datasource": "federated.09c20je0q5g3r21bbot2n14oiosj", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Response Rate", + "datasource": "federated.09c20je0q5g3r21bbot2n14oiosj", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Savings Amount", + "datasource": "federated.09c20je0q5g3r21bbot2n14oiosj", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "between", + "category", + "correlation", + "dimensions", + "heatmap", + "patterns", + "reference", + "show", + "template", + "two", + "xy" + ], + "sha256": "77c7d39de7fadc51d08556bbfa20ec5eec88f5afbe78bc35318ac951df839a1b" + }, + { + "id": "dashboard-tiled", + "type": "example", + "family": null, + "intent": "dashboard tiled", + "path": "./examples/dashboard-tiled.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "dashboard", + "example", + "tiled" + ], + "sha256": "d5f3fc60900eadddd6e72c5dd18c4f3981955498cb10296edc268e40cb2c4551" + }, + { + "id": "dashboard-validation-grid", + "type": "example", + "family": null, + "intent": "dashboard validation grid", + "path": "./examples/dashboard-validation-grid.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "dashboard", + "example", + "grid", + "validation" + ], + "sha256": "5a300bc8b7f4c5fc83ee0eb50e65a80a16c3c543b360d5253a4579e7edcabbbe" + }, + { + "id": "deviation-arrow", + "type": "template", + "family": null, + "intent": "deviation arrow", + "path": "./templates/reference/deviation-arrow.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Over-Under Sign", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "arrow", + "deviation", + "reference", + "template" + ], + "sha256": "fb3bc90ea9fd706ed831c2f2102101e487632157c8fba117c70fc4753fdce2c9" + }, + { + "id": "deviation-diverging-bar", + "type": "template", + "family": null, + "intent": "deviation diverging bar", + "path": "./templates/reference/deviation-diverging-bar.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1368249927221915648", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Calculation_1368249927221915648", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "bar", + "deviation", + "diverging", + "reference", + "template" + ], + "sha256": "459aca609b06a598c530d8b9570a5790ae023cd3b4934b48ed1271b546b9c547" + }, + { + "id": "deviation-gain-loss-chart", + "type": "template", + "family": null, + "intent": "deviation gain loss chart", + "path": "./templates/reference/deviation-gain-loss-chart.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_44402728363008000", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_44402728363352065", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_44402728363454466", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_44402728364228614", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "chart", + "deviation", + "gain", + "loss", + "reference", + "template" + ], + "sha256": "a681dbe8905d303c24aa3feec78f45a5e9516382223e325c0f3976bf1874e15c" + }, + { + "id": "deviation-spine-chart", + "type": "template", + "family": null, + "intent": "deviation spine chart", + "path": "./templates/reference/deviation-spine-chart.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency" + ], + "datasources": [ + "federated.1ko0q9z0cybhx212227b819gayqi" + ], + "fields": [ + { + "sourceField": "Calculation_2084392578408062979", + "datasource": "federated.1ko0q9z0cybhx212227b819gayqi", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "filters" + }, + { + "sourceField": "Calculation_2084392578409873414", + "datasource": "federated.1ko0q9z0cybhx212227b819gayqi", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Customer Name", + "datasource": "federated.1ko0q9z0cybhx212227b819gayqi", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Measure", + "datasource": "federated.1ko0q9z0cybhx212227b819gayqi", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Men (copy)", + "datasource": "federated.1ko0q9z0cybhx212227b819gayqi", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "chart", + "deviation", + "reference", + "spine", + "template" + ], + "sha256": "842a49705c35ac268e6ff8be45ed5312a091182f0343cdc8e875ce0d50bb4851" + }, + { + "id": "deviation__barbell__compare-two-values-per-category", + "type": "template", + "family": "deviation", + "intent": "compare two values per category", + "path": "./templates/reference/deviation__barbell__compare-two-values-per-category.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Segment", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "barbell", + "category", + "compare", + "deviation", + "per", + "reference", + "template", + "two", + "values" + ], + "sha256": "4da70b340fda323ab0540cca806c988c289100fba18e88115ab015b42b820ae7" + }, + { + "id": "deviation__bullet__track-actual-vs-target-and-performance-bands", + "type": "template", + "family": "deviation", + "intent": "track actual vs target and performance bands", + "path": "./templates/reference/deviation__bullet__track-actual-vs-target-and-performance-bands.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Above/Below (copy)_2476698368372916225", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1778077472749178880", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Calculation_1778077472749178880", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Calculation_1778077472749391873", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1778077472749391873", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "reference-line" + }, + { + "sourceField": "Calculation_2476698368372416512", + "datasource": "Sample - EU Superstore", + "datatype": "boolean", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Segment", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "actual", + "and", + "bands", + "bullet", + "deviation", + "performance", + "reference", + "target", + "template", + "track", + "vs" + ], + "sha256": "819f04fb7f7204ddc803249185ddb76ec23489301a6c82eede22f793e14f82ea" + }, + { + "id": "deviation__diverging-bar__show-positive-and-negative-vs-baseline", + "type": "template", + "family": "deviation", + "intent": "show positive and negative vs baseline", + "path": "./templates/reference/deviation__diverging-bar__show-positive-and-negative-vs-baseline.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1368249927221915648", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Calculation_2223652355933650945", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Country/Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "and", + "bar", + "baseline", + "deviation", + "diverging", + "negative", + "positive", + "reference", + "show", + "template", + "vs" + ], + "sha256": "b56aa1ff2027894fb73bf10de6e37756ef2b2ca7b8e88594058e61af579d2635" + }, + { + "id": "deviation__diverging-stacked-bar__show-sentiment-or-likert-breakdown", + "type": "template", + "family": "deviation", + "intent": "show sentiment or likert breakdown", + "path": "./templates/reference/deviation__diverging-stacked-bar__show-sentiment-or-likert-breakdown.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0sqeay81nbhomo1gxl1y71cdj990" + ], + "fields": [ + { + "sourceField": "Answer", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Answer", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1840846392184844308", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "filters" + }, + { + "sourceField": "Calculation_1840846392185118741", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Calculation_1840846392185389078", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "filters" + }, + { + "sourceField": "Calculation_1840846392186429466", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "filters" + }, + { + "sourceField": "Calculation_1840846392186605596", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1840846392186806302", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "filters" + }, + { + "sourceField": "Calculation_1840846392187043871", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Question Type", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Wording", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Wording", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "bar", + "breakdown", + "deviation", + "diverging", + "likert", + "or", + "reference", + "sentiment", + "show", + "stacked", + "template" + ], + "sha256": "c1bd2cc8ab303f8f43836bbacbda1c5769cf8aff72909aceadaf61000cbdf63e" + }, + { + "id": "deviation__spine__split-one-measure-into-two-opposing-parts", + "type": "template", + "family": "deviation", + "intent": "split one measure into two opposing parts", + "path": "./templates/reference/deviation__spine__split-one-measure-into-two-opposing-parts.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0w7d7y516eho731d703ht1yw6d0w" + ], + "fields": [ + { + "sourceField": "Calculation_937593187665391621", + "datasource": "federated.0w7d7y516eho731d703ht1yw6d0w", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Location", + "datasource": "federated.0w7d7y516eho731d703ht1yw6d0w", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Location", + "datasource": "federated.0w7d7y516eho731d703ht1yw6d0w", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Q1 - Yes (copy)_937593187665588230", + "datasource": "federated.0w7d7y516eho731d703ht1yw6d0w", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Q2_1 - Pulse Rate", + "datasource": "federated.0w7d7y516eho731d703ht1yw6d0w", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "deviation", + "into", + "measure", + "one", + "opposing", + "parts", + "reference", + "spine", + "split", + "template", + "two" + ], + "sha256": "b905be2cfb2914cad46ddc89db9b4f9e5c41845bbbd5ad30637372fa6d6dd9e7" + }, + { + "id": "deviation__surplus-deficit-area__show-above-below-baseline-over-time", + "type": "template", + "family": "deviation", + "intent": "show above below baseline over time", + "path": "./templates/reference/deviation__surplus-deficit-area__show-above-below-baseline-over-time.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Sub-Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "above", + "area", + "baseline", + "below", + "deficit", + "deviation", + "over", + "reference", + "show", + "surplus", + "template", + "time" + ], + "sha256": "93c5b88cfec31e378b3b4e76665716370559325585aa289a7bc1b63466e5bd3b" + }, + { + "id": "distribution-bar-code-chart", + "type": "template", + "family": null, + "intent": "distribution bar code chart", + "path": "./templates/executable/distribution-bar-code-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Country/Region", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "columns" + }, + { + "sourceField": "State/Province", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "bar", + "chart", + "code", + "distribution", + "executable", + "template" + ], + "sha256": "fc81c4f138da9f9e5a5118dc10cd7ee676d853f1b030361b49a055f53fe37bb0" + }, + { + "id": "distribution-histogram", + "type": "template", + "family": null, + "intent": "distribution histogram", + "path": "./templates/reference/distribution-histogram.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Count", + "shelf": "rows" + }, + { + "sourceField": "Profit (bin)", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "distribution", + "histogram", + "reference", + "template" + ], + "sha256": "140645ec718286b6c190faf46e4ce6f6257056024e691da4a84642f94432bd8a" + }, + { + "id": "distribution__barcode__show-all-values-as-marks-on-a-strip", + "type": "template", + "family": "distribution", + "intent": "show all values as marks on a strip", + "path": "./templates/reference/distribution__barcode__show-all-values-as-marks-on-a-strip.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Segment", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "a", + "all", + "as", + "barcode", + "distribution", + "marks", + "on", + "reference", + "show", + "strip", + "template", + "values" + ], + "sha256": "5fb5b23d191ad62c0cbbab1387b3d3cc1368c3f709a57853279089940e704f95" + }, + { + "id": "distribution__beeswarm__show-each-point-without-overlap-hiding-density", + "type": "template", + "family": "distribution", + "intent": "show each point without overlap hiding density", + "path": "./templates/reference/distribution__beeswarm__show-each-point-without-overlap-hiding-density.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.1hii5tt0bk6jak18l15yz06f3din" + ], + "fields": [ + { + "sourceField": "Calculation_917889942041595926", + "datasource": "federated.1hii5tt0bk6jak18l15yz06f3din", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Calculation_917889942041874457", + "datasource": "federated.1hii5tt0bk6jak18l15yz06f3din", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "ID", + "datasource": "federated.1hii5tt0bk6jak18l15yz06f3din", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "neighbourhood", + "datasource": "federated.1hii5tt0bk6jak18l15yz06f3din", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "neighbourhood", + "datasource": "federated.1hii5tt0bk6jak18l15yz06f3din", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "price", + "datasource": "federated.1hii5tt0bk6jak18l15yz06f3din", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "beeswarm", + "density", + "distribution", + "each", + "hiding", + "overlap", + "point", + "reference", + "show", + "template", + "without" + ], + "sha256": "48d54aa8582af6857655cc3748e91b36db423f8b059c9665b7493604f9911f4b" + }, + { + "id": "distribution__boxplot__summarize-median-spread-and-outliers-by-category", + "type": "template", + "family": "distribution", + "intent": "summarize median spread and outliers by category", + "path": "./templates/reference/distribution__boxplot__summarize-median-spread-and-outliers-by-category.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Profit", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Profit", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Segment", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "and", + "boxplot", + "by", + "category", + "distribution", + "median", + "outliers", + "reference", + "spread", + "summarize", + "template" + ], + "sha256": "3bbdc93d1af5dfe81456b64613754d7e8facd47c5cec1d4e1f90663f2197ac81" + }, + { + "id": "distribution__cumulative-curve__show-inequality-or-cumulative-share", + "type": "template", + "family": "distribution", + "intent": "show inequality or cumulative share", + "path": "./templates/reference/distribution__cumulative-curve__show-inequality-or-cumulative-share.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1840846392150978561", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1840846392150978561", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Calculation_1840846392155148294", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "cumulative", + "curve", + "distribution", + "inequality", + "or", + "reference", + "share", + "show", + "template" + ], + "sha256": "5bd36fe61bdf9812cf36356b1a7dbd1b8e53b6cb5ec8e7b7db714d42b9136fa9" + }, + { + "id": "distribution__dot-plot__show-min-max-or-range-across-categories", + "type": "template", + "family": "distribution", + "intent": "show min max or range across categories", + "path": "./templates/reference/distribution__dot-plot__show-min-max-or-range-across-categories.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_917889941776822277", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Calculation_917889941776945159", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Segment", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "across", + "categories", + "distribution", + "dot", + "max", + "min", + "or", + "plot", + "range", + "reference", + "show", + "template" + ], + "sha256": "c7fe1b0546ec6270d183eec396144eda750a6ad5ee035c8d486b7fa62f757c65" + }, + { + "id": "distribution__histogram__show-shape-and-frequency-of-a-measure", + "type": "template", + "family": "distribution", + "intent": "show shape and frequency of a measure", + "path": "./templates/reference/distribution__histogram__show-shape-and-frequency-of-a-measure.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.11xs2hw1547p7c12z6rii15tk9xk" + ], + "fields": [ + { + "sourceField": "Age (bin)", + "datasource": "federated.11xs2hw1547p7c12z6rii15tk9xk", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Pivot Field Values", + "datasource": "federated.11xs2hw1547p7c12z6rii15tk9xk", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "a", + "and", + "distribution", + "frequency", + "histogram", + "measure", + "of", + "reference", + "shape", + "show", + "template" + ], + "sha256": "335fab1e52817a9066ccb648ddabc8a9c2ee47374a1738f8bd3dcc13aba3d66c" + }, + { + "id": "distribution__population-pyramid__compare-mirrored-group-distributions", + "type": "template", + "family": "distribution", + "intent": "compare mirrored group distributions", + "path": "./templates/reference/distribution__population-pyramid__compare-mirrored-group-distributions.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.11xs2hw1547p7c12z6rii15tk9xk" + ], + "fields": [ + { + "sourceField": "Age", + "datasource": "federated.11xs2hw1547p7c12z6rii15tk9xk", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "M (copy)_95983007992475649", + "datasource": "federated.11xs2hw1547p7c12z6rii15tk9xk", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Pivot Field Names", + "datasource": "federated.11xs2hw1547p7c12z6rii15tk9xk", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "compare", + "distribution", + "distributions", + "group", + "mirrored", + "population", + "pyramid", + "reference", + "template" + ], + "sha256": "417063745baafcf29eace90fc85a33db8ef93e75b4b77453d9fd2304dd92db00" + }, + { + "id": "distribution__violin__show-full-density-shape-beyond-simple-summary", + "type": "template", + "family": "distribution", + "intent": "show full density shape beyond simple summary", + "path": "./templates/reference/distribution__violin__show-full-density-shape-beyond-simple-summary.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.1hii5tt0bk6jak18l15yz06f3din" + ], + "fields": [ + { + "sourceField": "Calculation_1915437258869919759", + "datasource": "federated.1hii5tt0bk6jak18l15yz06f3din", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Calculation_1915437258870394896", + "datasource": "federated.1hii5tt0bk6jak18l15yz06f3din", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Calculation_917889941767651328", + "datasource": "federated.1hii5tt0bk6jak18l15yz06f3din", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "beyond", + "density", + "distribution", + "full", + "reference", + "shape", + "show", + "simple", + "summary", + "template", + "violin" + ], + "sha256": "e028958aa4ba8331070fd4cbe449d081671683bb8d46307ddee5e83344b03800" + }, + { + "id": "dual-axis", + "type": "example", + "family": null, + "intent": "dual axis", + "path": "./examples/dual-axis.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "axis", + "dual", + "example" + ], + "sha256": "226219d2706ed7deeceb482fc110fa439bc162cda7c5dc8359397398fbc5acfe" + }, + { + "id": "encoding-pane-level", + "type": "example", + "family": null, + "intent": "encoding pane level", + "path": "./examples/encoding-pane-level.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "encoding", + "example", + "level", + "pane" + ], + "sha256": "3cffcc48962c428cd42896ca2898f3a94c664fff9090b31f3018f4700843a66a" + }, + { + "id": "filter-categorical", + "type": "example", + "family": null, + "intent": "filter categorical", + "path": "./examples/filter-categorical.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "categorical", + "example", + "filter" + ], + "sha256": "0fde5456d12808c6e89586da7823e9454d09d228405d636bf9531d399ca2f109" + }, + { + "id": "filter-relative-date", + "type": "example", + "family": null, + "intent": "filter relative date", + "path": "./examples/filter-relative-date.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "date", + "example", + "filter", + "relative" + ], + "sha256": "314bc9490cbdf22db69b10ffbe9956240f1d8563639de8a75d7a1a57ca09d1e4" + }, + { + "id": "flow__chord__show-two-way-flows-in-a-matrix", + "type": "template", + "family": "flow", + "intent": "show two way flows in a matrix", + "path": "./templates/reference/flow__chord__show-two-way-flows-in-a-matrix.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "federated.0ubafqv1bygk7b19u3voc1nh25s4" + ], + "fields": [ + { + "sourceField": "Calculation_1440926096150550", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "boolean", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1440926096482328", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1440926098092071", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Calculation_1440926098173992", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Calculation_1440926098292778", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "real", + "role": "measure", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1440926121443372", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Dimension", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Measure", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Rank", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Rank2", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "To Dimension", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "t", + "datasource": "federated.0ubafqv1bygk7b19u3voc1nh25s4", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "a", + "chord", + "flow", + "flows", + "in", + "matrix", + "reference", + "show", + "template", + "two", + "way" + ], + "sha256": "9e7d01ea0dc44cc569875758c24e06fd710bba7fafcf198559a8bb1e1c8e0fe5" + }, + { + "id": "flow__network__show-relationship-strength-among-nodes", + "type": "template", + "family": "flow", + "intent": "show relationship strength among nodes", + "path": "./templates/reference/flow__network__show-relationship-strength-among-nodes.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.139040n14xky88165h8nr1nfz546" + ], + "fields": [ + { + "sourceField": "Actor_Label", + "datasource": "federated.139040n14xky88165h8nr1nfz546", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Actor_Label", + "datasource": "federated.139040n14xky88165h8nr1nfz546", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "Edge_ID", + "datasource": "federated.139040n14xky88165h8nr1nfz546", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Movie", + "datasource": "federated.139040n14xky88165h8nr1nfz546", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Movie", + "datasource": "federated.139040n14xky88165h8nr1nfz546", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "Movie", + "datasource": "federated.139040n14xky88165h8nr1nfz546", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "marks" + }, + { + "sourceField": "Total_Screen_Time", + "datasource": "federated.139040n14xky88165h8nr1nfz546", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "X", + "datasource": "federated.139040n14xky88165h8nr1nfz546", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Y", + "datasource": "federated.139040n14xky88165h8nr1nfz546", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "among", + "flow", + "network", + "nodes", + "reference", + "relationship", + "show", + "strength", + "template" + ], + "sha256": "ff702edd47cb7b3a9d93f0de3902551a7b1716261313e49c360c3e7e852ffc6f" + }, + { + "id": "flow__sankey__trace-volume-through-multi-stage-paths", + "type": "template", + "family": "flow", + "intent": "trace volume through multi stage paths", + "path": "./templates/reference/flow__sankey__trace-volume-through-multi-stage-paths.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1316740006742511626", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Calculation_2063211644610277378", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_2063211644610392067", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Path Frame (bin)", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "flow", + "multi", + "paths", + "reference", + "sankey", + "stage", + "template", + "through", + "trace", + "volume" + ], + "sha256": "c8f4314015d9e7bd4a5f4e61673df90f4230416f3d8876cadb427a2761a09d39" + }, + { + "id": "flow__waterfall__sequence-budget-or-process-steps-with-plus-minus", + "type": "template", + "family": "flow", + "intent": "sequence budget or process steps with plus minus", + "path": "./templates/reference/flow__waterfall__sequence-budget-or-process-steps-with-plus-minus.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "multiple-datasources" + ], + "datasources": [ + "federated.1q3xxhn1t1nxoz17152l71ng6tqf", + "federated.1s4iy760mr8q5k1bhiupl0u002ul" + ], + "fields": [ + { + "sourceField": "Amount", + "datasource": "federated.1s4iy760mr8q5k1bhiupl0u002ul", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Calculation_5073656843881177127", + "datasource": "federated.1s4iy760mr8q5k1bhiupl0u002ul", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Calculation_5073656843881439273", + "datasource": "federated.1s4iy760mr8q5k1bhiupl0u002ul", + "datatype": "boolean", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Item", + "datasource": "federated.1s4iy760mr8q5k1bhiupl0u002ul", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "budget", + "flow", + "minus", + "or", + "plus", + "process", + "reference", + "sequence", + "steps", + "template", + "waterfall", + "with" + ], + "sha256": "981427a848a424cb2e4b4a12ff9efe0ca8daceab0fcf5f39d1125dfe5057c5b0" + }, + { + "id": "funnel-chart", + "type": "template", + "family": null, + "intent": "funnel chart", + "path": "./templates/executable/funnel-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "chart", + "executable", + "funnel", + "template" + ], + "sha256": "20da572ff84b24becc2c4c58a55be9735d40f47c176695a8c41ab45f1ccee08b" + }, + { + "id": "gantt-chart", + "type": "template", + "family": null, + "intent": "gantt chart", + "path": "./templates/reference/gantt-chart.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_291608117815463936", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Calculation_291608117815988225", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Profit (bin)", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Profit (bin)", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Region", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "chart", + "gantt", + "reference", + "template" + ], + "sha256": "7f579a09bc81c5c77d5538ff7fd487181e20217d5504523dc6a8cd3d9c79d524" + }, + { + "id": "gantt-task-rollup-chart", + "type": "template", + "family": null, + "intent": "gantt task rollup chart", + "path": "./templates/executable/gantt-task-rollup-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Min", + "shelf": "columns" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "chart", + "executable", + "gantt", + "rollup", + "task", + "template" + ], + "sha256": "33ef60bf177348b15747e7093b8aa87959d19428095164645478fdc4bf4b9c4b" + }, + { + "id": "gantt-timeline-chart", + "type": "template", + "family": null, + "intent": "gantt timeline chart", + "path": "./templates/executable/gantt-timeline-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Day-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "chart", + "executable", + "gantt", + "template", + "timeline" + ], + "sha256": "700770bc808e09cf62e73a5376aba273a1e9cbe6ab49ec6ca2b6e1ba60a2995f" + }, + { + "id": "insights__bar_chart", + "type": "template", + "family": "pulse-insights", + "intent": "Rank products by ARR within a date range", + "path": "./templates/executable/insights__bar_chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "ARR", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Close Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Product", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Product", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [ + { + "name": "DATE_MAX", + "type": "date", + "required": true + }, + { + "name": "DATE_MIN", + "type": "date", + "required": true + }, + { + "name": "DIRECTION", + "type": "enum", + "required": true, + "allowed": [ + "ASC", + "DESC" + ] + } + ], + "keywords": [ + "bar", + "chart", + "executable", + "insights", + "template" + ], + "sha256": "8bee7866c7b5b008d5385f8dcbbc8d8b5994818362f433735992c58ce095f022" + }, + { + "id": "insights__line_chart", + "type": "template", + "family": "pulse-insights", + "intent": "Show ARR over close date with a trend line", + "path": "./templates/executable/insights__line_chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "ARR", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Close Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Day-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Close Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "chart", + "executable", + "insights", + "line", + "template" + ], + "sha256": "2e223555446c9f940e3ac5f869114d42b3f2a25f5526e9f6af3188d2b19aaf71" + }, + { + "id": "kpi-text", + "type": "template", + "family": null, + "intent": "kpi text", + "path": "./templates/executable/kpi-text.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "executable", + "kpi", + "template", + "text" + ], + "sha256": "1735e90a01c9271d6cfc7b87fd64457a07df73fe6ea5431cc70feeadcadca935" + }, + { + "id": "lod-fixed", + "type": "example", + "family": null, + "intent": "lod fixed", + "path": "./examples/lod-fixed.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "example", + "fixed", + "lod" + ], + "sha256": "2f5919c25825ef62ac55e4817c5cf3c42d1778699805be5bc5d09f897755df6c" + }, + { + "id": "magnitude-paired-bar", + "type": "template", + "family": null, + "intent": "magnitude paired bar", + "path": "./templates/executable/magnitude-paired-bar.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "bar", + "executable", + "magnitude", + "paired", + "template" + ], + "sha256": "32e53b2ebb09340d5ed397068fbfdb85a1a179114ab184be1e717ad3976198b1" + }, + { + "id": "magnitude-paired-column-chart", + "type": "template", + "family": null, + "intent": "magnitude paired column chart", + "path": "./templates/executable/magnitude-paired-column-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "chart", + "column", + "executable", + "magnitude", + "paired", + "template" + ], + "sha256": "3730d01a636736403cfed4bcddc0a9db03f03c118758a5e123474ee39ae2ede0" + }, + { + "id": "magnitude-simple-bar", + "type": "template", + "family": null, + "intent": "magnitude simple bar", + "path": "./templates/executable/magnitude-simple-bar.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "bar", + "executable", + "magnitude", + "simple", + "template" + ], + "sha256": "dfbe60000d487c567100a9afe4bca3e2b3795775abe401a59e867c63064cd60f" + }, + { + "id": "magnitude__bubble-pack__compare-part-sizes-without-axes", + "type": "template", + "family": "magnitude", + "intent": "compare part sizes without axes", + "path": "./templates/reference/magnitude__bubble-pack__compare-part-sizes-without-axes.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "axes", + "bubble", + "compare", + "magnitude", + "pack", + "part", + "reference", + "sizes", + "template", + "without" + ], + "sha256": "5517425c0758dd9317233423685940a32f7a674e5d2b343357c3a3f835b3b145" + }, + { + "id": "magnitude__column__compare-sizes-from-zero", + "type": "template", + "family": "magnitude", + "intent": "compare sizes from zero", + "path": "./templates/reference/magnitude__column__compare-sizes-from-zero.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "column", + "compare", + "from", + "magnitude", + "reference", + "sizes", + "template", + "zero" + ], + "sha256": "9369a87b49a9cf8be3da2adbfbd45e2d626ff6719843249c294cda50e41b1bb0" + }, + { + "id": "magnitude__horizontal-bar__compare-discrete-categories-from-zero", + "type": "template", + "family": "magnitude", + "intent": "compare discrete categories from zero", + "path": "./templates/reference/magnitude__horizontal-bar__compare-discrete-categories-from-zero.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "bar", + "categories", + "compare", + "discrete", + "from", + "horizontal", + "magnitude", + "reference", + "template", + "zero" + ], + "sha256": "0abb65613ed1e504b5eb644e90d85e7107713ec8a48c775c8d04480c32bb8cf7" + }, + { + "id": "magnitude__lollipop__emphasize-values-over-bar-ink", + "type": "template", + "family": "magnitude", + "intent": "emphasize values over bar ink", + "path": "./templates/reference/magnitude__lollipop__emphasize-values-over-bar-ink.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "bar", + "emphasize", + "ink", + "lollipop", + "magnitude", + "over", + "reference", + "template", + "values" + ], + "sha256": "94aca3663743c3a706d57de3ca3562dbd03110eea30de024f40a2a1ec81c43c9" + }, + { + "id": "magnitude__paired-bar__compare-two-series-across-categories", + "type": "template", + "family": "magnitude", + "intent": "compare two series across categories", + "path": "./templates/reference/magnitude__paired-bar__compare-two-series-across-categories.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "rows" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "across", + "bar", + "categories", + "compare", + "magnitude", + "paired", + "reference", + "series", + "template", + "two" + ], + "sha256": "c9bf8dfacfafb5cfd8b97320b33bf71fd2ce92070f7af41be5b4d34e92a26fa9" + }, + { + "id": "magnitude__paired-column__compare-two-series-across-categories", + "type": "template", + "family": "magnitude", + "intent": "compare two series across categories", + "path": "./templates/reference/magnitude__paired-column__compare-two-series-across-categories.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "marks" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "across", + "categories", + "column", + "compare", + "magnitude", + "paired", + "reference", + "series", + "template", + "two" + ], + "sha256": "cf2f54988cd53d7310d4ef142e10dc8a12681329faed43965e432724282205c2" + }, + { + "id": "magnitude__parallel-coordinates__compare-entities-across-many-variables", + "type": "template", + "family": "magnitude", + "intent": "compare entities across many variables", + "path": "./templates/reference/magnitude__parallel-coordinates__compare-entities-across-many-variables.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "missing-column-metadata" + ], + "datasources": [ + "federated.0luwvdb15h38a719e117k10zo3f4" + ], + "fields": [ + { + "sourceField": "Calculation_3198400214763864065", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Country/Region", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Metric", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Metric", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Value", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Value", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "across", + "compare", + "coordinates", + "entities", + "magnitude", + "many", + "parallel", + "reference", + "template", + "variables" + ], + "sha256": "0ab5e1ec63a351f0780533f9369eacfa04b003358ca75093db357587c0d404ed" + }, + { + "id": "magnitude__pictogram__count-with-repeated-icons-whole-numbers-only", + "type": "template", + "family": "magnitude", + "intent": "count with repeated icons whole numbers only", + "path": "./templates/reference/magnitude__pictogram__count-with-repeated-icons-whole-numbers-only.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0sqeay81nbhomo1gxl1y71cdj990" + ], + "fields": [ + { + "sourceField": "Calculation_2535526642858991616", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Calculation_2535526642859171842", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Calculation_2535526642859171842", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Gender", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Generation", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Location", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "RespID", + "datasource": "federated.0sqeay81nbhomo1gxl1y71cdj990", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "count", + "icons", + "magnitude", + "numbers", + "only", + "pictogram", + "reference", + "repeated", + "template", + "whole", + "with" + ], + "sha256": "fc01e2922745fba4c7cd30afb16aba7815e66ac2c646027f12a1a8fc42e739d5" + }, + { + "id": "magnitude__proportional-symbol__show-size-when-fine-differences-do-not-matter", + "type": "template", + "family": "magnitude", + "intent": "show size when fine differences do not matter", + "path": "./templates/reference/magnitude__proportional-symbol__show-size-when-fine-differences-do-not-matter.tbm", + "tier": "reference", + "classificationReasons": [ + "inline-datasource" + ], + "datasources": [ + "World Indicators" + ], + "fields": [ + { + "sourceField": "CO2 Emissions", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "CO2 Emissions", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Avg", + "shelf": "rows" + }, + { + "sourceField": "Country/Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Avg", + "shelf": "columns" + }, + { + "sourceField": "GDP", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Population Total", + "datasource": "World Indicators", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Region", + "datasource": "World Indicators", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Year", + "datasource": "World Indicators", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "differences", + "do", + "fine", + "magnitude", + "matter", + "not", + "proportional", + "reference", + "show", + "size", + "symbol", + "template", + "when" + ], + "sha256": "4a1dd0499ee9b99d876be06a135a796f0a29c02e057cb51b329907de77369278" + }, + { + "id": "magnitude__radar__compare-many-variables-for-one-or-few-entities", + "type": "template", + "family": "magnitude", + "intent": "compare many variables for one or few entities", + "path": "./templates/reference/magnitude__radar__compare-many-variables-for-one-or-few-entities.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0luwvdb15h38a719e117k10zo3f4" + ], + "fields": [ + { + "sourceField": "Calculation_1753307682818641920", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Country/Region", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Metric", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Value", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "x (copy)_2126543503415009285", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "y (copy)_2126543503415336967", + "datasource": "federated.0luwvdb15h38a719e117k10zo3f4", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "compare", + "entities", + "few", + "for", + "magnitude", + "many", + "one", + "or", + "radar", + "reference", + "template", + "variables" + ], + "sha256": "bec17cdb77aacefa1af0e3c2c63e49a37e2e4be23337ae00903d5527504bd595" + }, + { + "id": "magnitude__radial-bar__show-circular-relative-bars-or-progress", + "type": "template", + "family": "magnitude", + "intent": "show circular relative bars or progress", + "path": "./templates/reference/magnitude__radial-bar__show-circular-relative-bars-or-progress.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "multiple-datasources" + ], + "datasources": [ + "Sample - EU Superstore", + "federated.0t13zrz1kvrxmp1ghyluy0ap2d64" + ], + "fields": [ + { + "sourceField": "Calculation_1440926071603207", + "datasource": "federated.0t13zrz1kvrxmp1ghyluy0ap2d64", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Calculation_1440926071709704", + "datasource": "federated.0t13zrz1kvrxmp1ghyluy0ap2d64", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Max Value (copy)_1440926071332868", + "datasource": "federated.0t13zrz1kvrxmp1ghyluy0ap2d64", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Pad (bin)", + "datasource": "federated.0t13zrz1kvrxmp1ghyluy0ap2d64", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Region", + "datasource": "federated.0t13zrz1kvrxmp1ghyluy0ap2d64", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "bar", + "bars", + "circular", + "magnitude", + "or", + "progress", + "radial", + "reference", + "relative", + "show", + "template" + ], + "sha256": "1fc2c83abbd6abeaa4911b2847aad02c34f3c19fe22cd7468b5da8dcadb8b916" + }, + { + "id": "mark-encoding", + "type": "example", + "family": null, + "intent": "mark encoding", + "path": "./examples/mark-encoding.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "encoding", + "example", + "mark" + ], + "sha256": "52ead607ee562e00c0aa8c66afb57cc04bef0607d0756d0c04f775861a9490ea" + }, + { + "id": "minimal-workbook", + "type": "starter", + "family": null, + "intent": "minimal workbook", + "path": "./starters/minimal-workbook.twb", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "minimal", + "starter", + "workbook" + ], + "sha256": "6109abd16678763236f64505905e2396fa8930c631b1db0c38965a5517bb2376" + }, + { + "id": "parameter", + "type": "example", + "family": null, + "intent": "parameter", + "path": "./examples/parameter.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "example", + "parameter" + ], + "sha256": "6ac287f18510861a4c73334a1ee4bba1c04ac14c729a92e5e254e39266cc81b2" + }, + { + "id": "pareto-chart", + "type": "template", + "family": null, + "intent": "pareto chart", + "path": "./templates/reference/pareto-chart.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Parameter 3", + "datasource": "Parameters", + "datatype": "real", + "role": "measure", + "derivation": null, + "shelf": "reference-line" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "chart", + "pareto", + "reference", + "template" + ], + "sha256": "0009484326f1fa0f62aad910cfd28852e6d8de51ecea4c933f78c3896591a418" + }, + { + "id": "part-to-whole-pie-chart", + "type": "template", + "family": null, + "intent": "part to whole pie chart", + "path": "./templates/executable/part-to-whole-pie-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "chart", + "executable", + "part", + "pie", + "template", + "to", + "whole" + ], + "sha256": "92e2482cecb0248fb3bf48b3f23c0f82936c6c210854ed0cc319e3432854dd5d" + }, + { + "id": "part-to-whole-proportional-stacked-bar", + "type": "template", + "family": null, + "intent": "part to whole proportional stacked bar", + "path": "./templates/reference/part-to-whole-proportional-stacked-bar.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_3630088501878784", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "bar", + "part", + "proportional", + "reference", + "stacked", + "template", + "to", + "whole" + ], + "sha256": "5d53f5106e224f76da537f2b91269d61c1d824f085660a5491becbb952dae9c8" + }, + { + "id": "part-to-whole-stacked-bar-chart", + "type": "template", + "family": null, + "intent": "part to whole stacked bar chart", + "path": "./templates/executable/part-to-whole-stacked-bar-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "bar", + "chart", + "executable", + "part", + "stacked", + "template", + "to", + "whole" + ], + "sha256": "87e4f48c72393923d5b16c74f9f77b7897ef4dec7344fc8a34a7fe9ff7797675" + }, + { + "id": "part-to-whole-treemap-chart", + "type": "template", + "family": null, + "intent": "part to whole treemap chart", + "path": "./templates/executable/part-to-whole-treemap-chart.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Product Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "chart", + "executable", + "part", + "template", + "to", + "treemap", + "whole" + ], + "sha256": "c42b14662805384857834ed6df8838ecd98874eef7928104e553b5ef0c69affa" + }, + { + "id": "part-to-whole-waterfall", + "type": "template", + "family": null, + "intent": "part to whole waterfall", + "path": "./templates/reference/part-to-whole-waterfall.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_767019348535836686", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "part", + "reference", + "template", + "to", + "waterfall", + "whole" + ], + "sha256": "a565ac1168c253094100026f0f34eed4e90dea06347f2f1d16947108572a7e4c" + }, + { + "id": "part-to-whole__arc__schematic-hierarchical-breakdown-use-sparingly", + "type": "template", + "family": "part-to-whole", + "intent": "schematic hierarchical breakdown use sparingly", + "path": "./templates/reference/part-to-whole__arc__schematic-hierarchical-breakdown-use-sparingly.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "9. X (copy)_1230327185373634573", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Calculation_1230327185363431426", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1230327185373503500", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Range", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "arc", + "breakdown", + "hierarchical", + "part", + "reference", + "schematic", + "sparingly", + "template", + "to", + "use", + "whole" + ], + "sha256": "da7a49a05101131cddcd3ae58242536b774f1c5ff26cf996c748a65aa66514d7" + }, + { + "id": "part-to-whole__donut__show-parts-with-center-space-for-total", + "type": "template", + "family": "part-to-whole", + "intent": "show parts with center space for total", + "path": "./templates/reference/part-to-whole__donut__show-parts-with-center-space-for-total.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_3464112593791664145", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "center", + "donut", + "for", + "part", + "parts", + "reference", + "show", + "space", + "template", + "to", + "total", + "whole", + "with" + ], + "sha256": "96065ab4ef6b127d43c6c96f27b398e898ad856a365596bb52b340be80eea59e" + }, + { + "id": "part-to-whole__funnel__show-stage-dropoff-through-a-process", + "type": "template", + "family": "part-to-whole", + "intent": "show stage dropoff through a process", + "path": "./templates/reference/part-to-whole__funnel__show-stage-dropoff-through-a-process.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0ycp03o15aqa4t1gd5b301henmz0" + ], + "fields": [ + { + "sourceField": "Calculation_1440926082236429", + "datasource": "federated.0ycp03o15aqa4t1gd5b301henmz0", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "filters" + }, + { + "sourceField": "Category", + "datasource": "federated.0ycp03o15aqa4t1gd5b301henmz0", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Value", + "datasource": "federated.0ycp03o15aqa4t1gd5b301henmz0", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "a", + "dropoff", + "funnel", + "part", + "process", + "reference", + "show", + "stage", + "template", + "through", + "to", + "whole" + ], + "sha256": "47adb35a62391d4890e21336bebe8ce60f9a191a7a09b87f15a5fa1e4b9d335a" + }, + { + "id": "part-to-whole__marimekko__encode-share-with-both-width-and-height", + "type": "template", + "family": "part-to-whole", + "intent": "encode share with both width and height", + "path": "./templates/reference/part-to-whole__marimekko__encode-share-with-both-width-and-height.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1690820235271180288", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Calculation_1690820235271180288", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "rows" + }, + { + "sourceField": "Segment", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "and", + "both", + "encode", + "height", + "marimekko", + "part", + "reference", + "share", + "template", + "to", + "whole", + "width", + "with" + ], + "sha256": "c4a288391451e5c2bdb9b18cb0c3852d20bf279cd593dfb0265fdefd693a795c" + }, + { + "id": "part-to-whole__pie__simple-few-part-composition", + "type": "template", + "family": "part-to-whole", + "intent": "simple few part composition", + "path": "./templates/reference/part-to-whole__pie__simple-few-part-composition.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1230327185361571841", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "composition", + "few", + "part", + "pie", + "reference", + "simple", + "template", + "to", + "whole" + ], + "sha256": "f78c748fc79c4ce941d69ba2a4370b898aab5cc63f4e00da1eb8c8acb96d50b4" + }, + { + "id": "part-to-whole__polar-area__compare-parts-on-a-radial-axis", + "type": "template", + "family": "part-to-whole", + "intent": "compare parts on a radial axis", + "path": "./templates/reference/part-to-whole__polar-area__compare-parts-on-a-radial-axis.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0ekaykw02fhokp0zlnc6r075pqpt" + ], + "fields": [ + { + "sourceField": "Calculation_674414107083653139", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Calculation_674414107083878420", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Metric", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Pad", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Percentile Rank", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "player", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "player", + "datasource": "federated.0ekaykw02fhokp0zlnc6r075pqpt", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "a", + "area", + "axis", + "compare", + "on", + "part", + "parts", + "polar", + "radial", + "reference", + "template", + "to", + "whole" + ], + "sha256": "3fbfbbc75288dc4292de23ec87b7d12f1b72af736b2ef3ed0fb74c2f2da43cd8" + }, + { + "id": "part-to-whole__proportional-stacked-bar__show-size-and-share-together", + "type": "template", + "family": "part-to-whole", + "intent": "show size and share together", + "path": "./templates/reference/part-to-whole__proportional-stacked-bar__show-size-and-share-together.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_4533013781886447620", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Category", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Region", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "and", + "bar", + "part", + "proportional", + "reference", + "share", + "show", + "size", + "stacked", + "template", + "to", + "together", + "whole" + ], + "sha256": "8ef9cb182482510d35e931ad1e3055897ca0d7a48be4cc837ef24adfb1c6ab6a" + }, + { + "id": "part-to-whole__stacked-column__compare-composition-across-categories", + "type": "template", + "family": "part-to-whole", + "intent": "compare composition across categories", + "path": "./templates/reference/part-to-whole__stacked-column__compare-composition-across-categories.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "rows" + }, + { + "sourceField": "Segment", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "across", + "categories", + "column", + "compare", + "composition", + "part", + "reference", + "stacked", + "template", + "to", + "whole" + ], + "sha256": "43e4eaf89d9adf31be20a94bc7a2f1bcb66bf90c968c8d7f526536a46bab3bd0" + }, + { + "id": "part-to-whole__sunburst__show-nested-hierarchy-as-rings", + "type": "template", + "family": "part-to-whole", + "intent": "show nested hierarchy as rings", + "path": "./templates/reference/part-to-whole__sunburst__show-nested-hierarchy-as-rings.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1230327185376665617", + "datasource": "Sample - EU Superstore", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "Category (copy)_1230327185380192275", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Region (copy)_1230327185378156562", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Segment", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "as", + "hierarchy", + "nested", + "part", + "reference", + "rings", + "show", + "sunburst", + "template", + "to", + "whole" + ], + "sha256": "b54f27eb06eace4a8e7bece2425230d10258242f21f9973e6f97135633822a05" + }, + { + "id": "part-to-whole__treemap__show-hierarchical-sizes-in-nested-rectangles", + "type": "template", + "family": "part-to-whole", + "intent": "show hierarchical sizes in nested rectangles", + "path": "./templates/reference/part-to-whole__treemap__show-hierarchical-sizes-in-nested-rectangles.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Country/Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "hierarchical", + "in", + "nested", + "part", + "rectangles", + "reference", + "show", + "sizes", + "template", + "to", + "treemap", + "whole" + ], + "sha256": "e5e5d6775e61ebddd2fed3ce694fd308ff327f81204dc08e4d4af8e32a6280a4" + }, + { + "id": "part-to-whole__unit-grid__show-percentages-as-filled-cells", + "type": "template", + "family": "part-to-whole", + "intent": "show percentages as filled cells", + "path": "./templates/reference/part-to-whole__unit-grid__show-percentages-as-filled-cells.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "multiple-datasources" + ], + "datasources": [ + "Sample - EU Superstore", + "federated.1or5ea20ktzg3y11wyj1a1k8aw9q" + ], + "fields": [ + { + "sourceField": "Calculation_1368249927221915648", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_722827798441152513", + "datasource": "federated.1or5ea20ktzg3y11wyj1a1k8aw9q", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Calculation_722827798444875779", + "datasource": "federated.1or5ea20ktzg3y11wyj1a1k8aw9q", + "datatype": "boolean", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Column", + "datasource": "federated.1or5ea20ktzg3y11wyj1a1k8aw9q", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Row", + "datasource": "federated.1or5ea20ktzg3y11wyj1a1k8aw9q", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "as", + "cells", + "filled", + "grid", + "part", + "percentages", + "reference", + "show", + "template", + "to", + "unit", + "whole" + ], + "sha256": "b19d685524e543e8d9059022b6368e323074f1c888c1091846a9c953f12d27ef" + }, + { + "id": "part-to-whole__venn__schematic-overlap-between-sets", + "type": "template", + "family": "part-to-whole", + "intent": "schematic overlap between sets", + "path": "./templates/reference/part-to-whole__venn__schematic-overlap-between-sets.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_3428928227010420736", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Calculation_3428928227010629633", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "User", + "shelf": "columns" + }, + { + "sourceField": "Calculation_3428928227010703362", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_3428928227011305477", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Min", + "shelf": "rows" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "marks" + }, + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "between", + "overlap", + "part", + "reference", + "schematic", + "sets", + "template", + "to", + "venn", + "whole" + ], + "sha256": "fa00953cc52e114c5f93f2bf1fcd97c14cc24eaec68726815e25695051044e79" + }, + { + "id": "part-to-whole__waterfall__bridge-start-to-end-with-plus-minus-steps", + "type": "template", + "family": "part-to-whole", + "intent": "bridge start to end with plus minus steps", + "path": "./templates/reference/part-to-whole__waterfall__bridge-start-to-end-with-plus-minus-steps.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.1h2onm80d10fnc0zqfka50nszgpx" + ], + "fields": [ + { + "sourceField": "Calculation_3900961764665905157", + "datasource": "federated.1h2onm80d10fnc0zqfka50nszgpx", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Calculation_3900961764669181963", + "datasource": "federated.1h2onm80d10fnc0zqfka50nszgpx", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Pivot Field Names", + "datasource": "federated.1h2onm80d10fnc0zqfka50nszgpx", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Pivot Field Names", + "datasource": "federated.1h2onm80d10fnc0zqfka50nszgpx", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Pivot Field Values", + "datasource": "federated.1h2onm80d10fnc0zqfka50nszgpx", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "bridge", + "end", + "minus", + "part", + "plus", + "reference", + "start", + "steps", + "template", + "to", + "waterfall", + "whole", + "with" + ], + "sha256": "06fb5d7e92df2b9e316833419c4cdffe2567cd5f192dd0c3477f66934768bc3c" + }, + { + "id": "quota-attainment-bullet", + "type": "template", + "family": null, + "intent": "quota attainment bullet", + "path": "./templates/executable/quota-attainment-bullet.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + } + ], + "parameters": [], + "keywords": [ + "attainment", + "bullet", + "executable", + "quota", + "template" + ], + "sha256": "862eee7004e9d7302312c7657106e91b9a7c7462d12d94bc348782c0fb71dcba" + }, + { + "id": "ranking-bump-chart", + "type": "template", + "family": null, + "intent": "ranking bump chart", + "path": "./templates/reference/ranking-bump-chart.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_508343847073411072", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Calculation_508343847073411072", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "rows" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "bump", + "chart", + "ranking", + "reference", + "template" + ], + "sha256": "0c9dff2a374eebb5471bdac151c76003b7eed5f6360c5bd41bb8ae0d7f9af054" + }, + { + "id": "ranking-dot-strip-plot", + "type": "template", + "family": null, + "intent": "ranking dot strip plot", + "path": "./templates/executable/ranking-dot-strip-plot.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + } + ], + "parameters": [], + "keywords": [ + "dot", + "executable", + "plot", + "ranking", + "strip", + "template" + ], + "sha256": "b90326968bd8032cb1d4efd602e0812f4e5e3ca2ce0a159121af764cdd38d97d" + }, + { + "id": "ranking-ordered-bar", + "type": "template", + "family": null, + "intent": "ranking ordered bar", + "path": "./templates/executable/ranking-ordered-bar.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "bar", + "executable", + "ordered", + "ranking", + "template" + ], + "sha256": "40166b5b9740148c0c8efd479bf6c5018f7db1858def20e0b1ba63ef7d1d7bd1" + }, + { + "id": "ranking-ordered-column", + "type": "template", + "family": null, + "intent": "ranking ordered column", + "path": "./templates/executable/ranking-ordered-column.tbm", + "tier": "executable", + "classificationReasons": [], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "column", + "executable", + "ordered", + "ranking", + "template" + ], + "sha256": "c3b7160b2e31994e42b0fe54b2ec4176191482067dcc42507f006ae522c778f8" + }, + { + "id": "ranking__bump__track-rank-changes-across-many-periods", + "type": "template", + "family": "ranking", + "intent": "track rank changes across many periods", + "path": "./templates/reference/ranking__bump__track-rank-changes-across-many-periods.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Country/Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "marks" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "rows" + }, + { + "sourceField": "Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "across", + "bump", + "changes", + "many", + "periods", + "rank", + "ranking", + "reference", + "template", + "track" + ], + "sha256": "7a14f97086632bfdc2c9d37d06fd46fda13366a2067ec24b5c91d47ee7d9cdeb" + }, + { + "id": "ranking__dot-strip__space-efficient-ranks-across-many-categories", + "type": "template", + "family": "ranking", + "intent": "space efficient ranks across many categories", + "path": "./templates/reference/ranking__dot-strip__space-efficient-ranks-across-many-categories.tbm", + "tier": "reference", + "classificationReasons": [ + "inline-datasource" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month", + "shelf": "rows" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Sub-Category", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "across", + "categories", + "dot", + "efficient", + "many", + "ranking", + "ranks", + "reference", + "space", + "strip", + "template" + ], + "sha256": "7ffb45dca848f37cb53ef29c1e7b579d3ce265a5c98fe1518b6a93b7603c5338" + }, + { + "id": "ranking__lollipop__rank-and-highlight-values-with-less-ink", + "type": "template", + "family": "ranking", + "intent": "rank and highlight values with less ink", + "path": "./templates/reference/ranking__lollipop__rank-and-highlight-values-with-less-ink.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "columns" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "and", + "highlight", + "ink", + "less", + "lollipop", + "rank", + "ranking", + "reference", + "template", + "values", + "with" + ], + "sha256": "767be72515338ead326d9f3d8786b9edf0d29f05521f95eb7b763d4391d30ead" + }, + { + "id": "ranking__ordered-bar__show-order-when-rank-matters-more-than-value", + "type": "template", + "family": "ranking", + "intent": "show order when rank matters more than value", + "path": "./templates/reference/ranking__ordered-bar__show-order-when-rank-matters-more-than-value.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "columns" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "bar", + "matters", + "more", + "order", + "ordered", + "rank", + "ranking", + "reference", + "show", + "template", + "than", + "value", + "when" + ], + "sha256": "bf043b0b6f99792e010ff6b28905e46d38367dbf3efa60425a347c490afc2f9b" + }, + { + "id": "ranking__ordered-column__show-order-when-rank-matters-more-than-value", + "type": "template", + "family": "ranking", + "intent": "show order when rank matters more than value", + "path": "./templates/reference/ranking__ordered-column__show-order-when-rank-matters-more-than-value.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Delivery Mode", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "columns" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "column", + "matters", + "more", + "order", + "ordered", + "rank", + "ranking", + "reference", + "show", + "template", + "than", + "value", + "when" + ], + "sha256": "be26565224d46a85f5bad347c8ed4245abf8d5cd795fe418800d1f05a11ad350" + }, + { + "id": "ranking__ordered-proportional-symbol__rank-with-large-value-spreads", + "type": "template", + "family": "ranking", + "intent": "rank with large value spreads", + "path": "./templates/reference/ranking__ordered-proportional-symbol__rank-with-large-value-spreads.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter", + "shelf": "marks" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "columns" + }, + { + "sourceField": "Order ID", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "CountD", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "large", + "ordered", + "proportional", + "rank", + "ranking", + "reference", + "spreads", + "symbol", + "template", + "value", + "with" + ], + "sha256": "fdf3cdef25ae8222f248bfcf7ced656f67eddd6dce1ad847112aa034af584545" + }, + { + "id": "ranking__slope-rank__show-rank-swaps-between-two-periods", + "type": "template", + "family": "ranking", + "intent": "show rank swaps between two periods", + "path": "./templates/reference/ranking__slope-rank__show-rank-swaps-between-two-periods.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1992279925712601105", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Sub-Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "between", + "periods", + "rank", + "ranking", + "reference", + "show", + "slope", + "swaps", + "template", + "two" + ], + "sha256": "68c41e202d0713546d23676911267effea82085ee9a395de9d662cf91cd19760" + }, + { + "id": "ranking__slope__compare-rank-or-value-change-between-two-points", + "type": "template", + "family": "ranking", + "intent": "compare rank or value change between two points", + "path": "./templates/reference/ranking__slope__compare-rank-or-value-change-between-two-points.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_1992279925712601105", + "datasource": "Sample - EU Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Calculation_1992279925713322002", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "columns" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - EU Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Year", + "shelf": "filters" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Sub-Category", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "between", + "change", + "compare", + "or", + "points", + "rank", + "ranking", + "reference", + "slope", + "template", + "two", + "value" + ], + "sha256": "9f767cadfc9f466fd2e5e6ac90998200123bedf5f30297ea81c951669c5e02b7" + }, + { + "id": "reference-line", + "type": "example", + "family": null, + "intent": "reference line", + "path": "./examples/reference-line.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "example", + "line", + "reference" + ], + "sha256": "e7a84d40bf6aeaea1588a7a0fb0d0660aac96de935b79529d6d6d71ee57442f8" + }, + { + "id": "sankey-viz-extension", + "type": "template", + "family": null, + "intent": "sankey viz extension", + "path": "./templates/reference/sankey-viz-extension.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "viz-extension" + ], + "datasources": [ + "federated.0sws74t0fh46kq19oyksf18yjlvo" + ], + "fields": [ + { + "sourceField": "Calculation_100000000001", + "datasource": "federated.0sws74t0fh46kq19oyksf18yjlvo", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "country", + "datasource": "federated.0sws74t0fh46kq19oyksf18yjlvo", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "group", + "datasource": "federated.0sws74t0fh46kq19oyksf18yjlvo", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "extension", + "reference", + "sankey", + "template", + "viz" + ], + "sha256": "e8bdd0dd6c2285e4a7812a867a6f257c2d0e33931586b3475b584a749371d414" + }, + { + "id": "slope-chart", + "type": "template", + "family": null, + "intent": "slope chart", + "path": "./templates/reference/slope-chart.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_6093681433239552", + "datasource": "Sample - Superstore", + "datatype": "boolean", + "role": "measure", + "derivation": "User", + "shelf": "filters" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Quarter-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "chart", + "reference", + "slope", + "template" + ], + "sha256": "4f57a0a633188bade4e20c63590c891e990c7309ff63c14e57531b1f398e8081" + }, + { + "id": "sort", + "type": "example", + "family": null, + "intent": "sort", + "path": "./examples/sort.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "example", + "sort" + ], + "sha256": "e3a79f489d552a3b68ab306e6d3c4f2a28d66164cdbe7360e775bfad30290915" + }, + { + "id": "spatial-choropleth-map", + "type": "template", + "family": null, + "intent": "spatial choropleth map", + "path": "./templates/reference/spatial-choropleth-map.tbm", + "tier": "reference", + "classificationReasons": [ + "unresolved-field-reference" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Country/Region", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "State/Province", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "choropleth", + "map", + "reference", + "spatial", + "template" + ], + "sha256": "a022caea39565521e4b8c1b1dcd82753bd6fafb02b93e38489736e3186a31d6f" + }, + { + "id": "spatial-symbol-map", + "type": "template", + "family": null, + "intent": "spatial symbol map", + "path": "./templates/reference/spatial-symbol-map.tbm", + "tier": "reference", + "classificationReasons": [ + "unresolved-field-reference" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "City", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Country/Region", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "State/Province", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "map", + "reference", + "spatial", + "symbol", + "template" + ], + "sha256": "dc5e95cae6382aeb227672e2594708dd7d83dc94af975f3091b60fa0c6409670" + }, + { + "id": "spatial-symbol-map-latlon", + "type": "template", + "family": null, + "intent": "spatial symbol map latlon", + "path": "./templates/reference/spatial-symbol-map-latlon.tbm", + "tier": "reference", + "classificationReasons": [ + "unresolved-field-reference" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Country/Region", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "columns" + }, + { + "sourceField": "Sales", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "rows" + }, + { + "sourceField": "State/Province", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "latlon", + "map", + "reference", + "spatial", + "symbol", + "template" + ], + "sha256": "426961126af0ebd3ebc788bf977b6bae456d8ed4cedc30fab91094c01b9ecba3" + }, + { + "id": "spatial__cartogram__resize-regions-by-a-value", + "type": "template", + "family": "spatial", + "intent": "resize regions by a value", + "path": "./templates/reference/spatial__cartogram__resize-regions-by-a-value.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "inline-datasource", + "multiple-datasources", + "unresolved-field-reference" + ], + "datasources": [ + "federated.054wmni0kuswrm10p9guf09s1ka5", + "federated.09day2w0kb7skl1fs2awr1az2gv9", + "federated.18kmj8g0nbq4nj108jil60nhvj7v", + "federated.1cdmrio0h0k6lq1buaesf0xtg6ml" + ], + "fields": [ + { + "sourceField": "Geometry", + "datasource": "federated.09day2w0kb7skl1fs2awr1az2gv9", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "Geometry", + "datasource": "federated.18kmj8g0nbq4nj108jil60nhvj7v", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "Group (uk_group_population.csv)", + "datasource": "federated.18kmj8g0nbq4nj108jil60nhvj7v", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Population", + "datasource": "federated.18kmj8g0nbq4nj108jil60nhvj7v", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "a", + "by", + "cartogram", + "reference", + "regions", + "resize", + "spatial", + "template", + "value" + ], + "sha256": "d2a6c72655fcb44c294a774072a902e5a906770926640ae3328b3bf2939d4ce5" + }, + { + "id": "spatial__choropleth__map-rates-or-ratios-by-region", + "type": "template", + "family": "spatial", + "intent": "map rates or ratios by region", + "path": "./templates/reference/spatial__choropleth__map-rates-or-ratios-by-region.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Country/Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Profit", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "by", + "choropleth", + "map", + "or", + "rates", + "ratios", + "reference", + "region", + "spatial", + "template" + ], + "sha256": "8f245fc90169f7038d5b76b81056a6ace5d142ba85be341a8e4f559fa98a5e00" + }, + { + "id": "spatial__contour__show-equal-value-bands-across-geography", + "type": "template", + "family": "spatial", + "intent": "show equal value bands across geography", + "path": "./templates/reference/spatial__contour__show-equal-value-bands-across-geography.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "federated.1dac6fs09zddmk18appyy0imrhcl" + ], + "fields": [ + { + "sourceField": "ID", + "datasource": "federated.1dac6fs09zddmk18appyy0imrhcl", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "PROP_VALUE", + "datasource": "federated.1dac6fs09zddmk18appyy0imrhcl", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "SpatialObj", + "datasource": "federated.1dac6fs09zddmk18appyy0imrhcl", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "across", + "bands", + "contour", + "equal", + "geography", + "reference", + "show", + "spatial", + "template", + "value" + ], + "sha256": "579ebef64ba7bbabf02262deb6dfaf3b0fa23a38557d391eeb91e5ab8542ba7c" + }, + { + "id": "spatial__density-map__show-intensity-hotspots-not-tied-to-admin-units", + "type": "template", + "family": "spatial", + "intent": "show intensity hotspots not tied to admin units", + "path": "./templates/reference/spatial__density-map__show-intensity-hotspots-not-tied-to-admin-units.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "federated.1jzs8720grz7zz1bdtv5w02zxx3y" + ], + "fields": [ + { + "sourceField": "Calculation_3464112593488449540", + "datasource": "federated.1jzs8720grz7zz1bdtv5w02zxx3y", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "Crime ID", + "datasource": "federated.1jzs8720grz7zz1bdtv5w02zxx3y", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "admin", + "density", + "hotspots", + "intensity", + "map", + "not", + "reference", + "show", + "spatial", + "template", + "tied", + "to", + "units" + ], + "sha256": "30d27f05b71317d40155690b395eaa3ada99b2f1494dc64bc0aa68719e5e1985" + }, + { + "id": "spatial__dot-density__plot-individual-locations-or-events", + "type": "template", + "family": "spatial", + "intent": "plot individual locations or events", + "path": "./templates/reference/spatial__dot-density__plot-individual-locations-or-events.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "federated.1jzs8720grz7zz1bdtv5w02zxx3y" + ], + "fields": [ + { + "sourceField": "Calculation_3464112593488449540", + "datasource": "federated.1jzs8720grz7zz1bdtv5w02zxx3y", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "Crime ID", + "datasource": "federated.1jzs8720grz7zz1bdtv5w02zxx3y", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "density", + "dot", + "events", + "individual", + "locations", + "or", + "plot", + "reference", + "spatial", + "template" + ], + "sha256": "66eaa62089393e033a9345f1ae26e2ad45e43d14fe9f65e3e1bd7d9022066f7c" + }, + { + "id": "spatial__equalized-cartogram__give-each-region-equal-shape-weight", + "type": "template", + "family": "spatial", + "intent": "give each region equal shape weight", + "path": "./templates/reference/spatial__equalized-cartogram__give-each-region-equal-shape-weight.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "federated.1cil50k16r0j6o1feqp6r0ey3ij7" + ], + "fields": [ + { + "sourceField": "Borough", + "datasource": "federated.1cil50k16r0j6o1feqp6r0ey3ij7", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Crime_type", + "datasource": "federated.1cil50k16r0j6o1feqp6r0ey3ij7", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Crimes", + "datasource": "federated.1cil50k16r0j6o1feqp6r0ey3ij7", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Geometry", + "datasource": "federated.1cil50k16r0j6o1feqp6r0ey3ij7", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "GridName", + "datasource": "federated.1cil50k16r0j6o1feqp6r0ey3ij7", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "cartogram", + "each", + "equal", + "equalized", + "give", + "reference", + "region", + "shape", + "spatial", + "template", + "weight" + ], + "sha256": "8cf5b9b413de7c25df0ad66af9c051f393a3c955f0bac4b7bf81d4def43a41ab" + }, + { + "id": "spatial__flow-map__show-movement-between-places", + "type": "template", + "family": "spatial", + "intent": "show movement between places", + "path": "./templates/reference/spatial__flow-map__show-movement-between-places.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "federated.084sojc09l39kh1g4936b0eeh3j4" + ], + "fields": [ + { + "sourceField": "Calculation_3464112593486299137", + "datasource": "federated.084sojc09l39kh1g4936b0eeh3j4", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "Calculation_3464112593486794755", + "datasource": "federated.084sojc09l39kh1g4936b0eeh3j4", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "Destination Airport", + "datasource": "federated.084sojc09l39kh1g4936b0eeh3j4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Destination Name", + "datasource": "federated.084sojc09l39kh1g4936b0eeh3j4", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "Origin Airport", + "datasource": "federated.084sojc09l39kh1g4936b0eeh3j4", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Origin Airport", + "datasource": "federated.084sojc09l39kh1g4936b0eeh3j4", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "Origin Airport Location (copy)_3464112593486376962", + "datasource": "federated.084sojc09l39kh1g4936b0eeh3j4", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "Origin Name", + "datasource": "federated.084sojc09l39kh1g4936b0eeh3j4", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "between", + "flow", + "map", + "movement", + "places", + "reference", + "show", + "spatial", + "template" + ], + "sha256": "02d854ad8bf81929174e1af5fca380803440b7f2a244912b2782f0c2a7a20cea" + }, + { + "id": "spatial__grid-heatmap__map-intensity-on-a-grid-not-admin-boundaries", + "type": "template", + "family": "spatial", + "intent": "map intensity on a grid not admin boundaries", + "path": "./templates/reference/spatial__grid-heatmap__map-intensity-on-a-grid-not-admin-boundaries.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "inline-datasource", + "multiple-datasources", + "unresolved-field-reference" + ], + "datasources": [ + "federated.076gplu1ir2fb11aymn51116xv34", + "federated.1a5qkzd06a8nie14hjbdp12e6af9" + ], + "fields": [ + { + "sourceField": "Geometry", + "datasource": "federated.1a5qkzd06a8nie14hjbdp12e6af9", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "Tile_Name", + "datasource": "federated.1a5qkzd06a8nie14hjbdp12e6af9", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Tile_Num", + "datasource": "federated.1a5qkzd06a8nie14hjbdp12e6af9", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "a", + "admin", + "boundaries", + "grid", + "heatmap", + "intensity", + "map", + "not", + "on", + "reference", + "spatial", + "template" + ], + "sha256": "2f651e51f0d8a83b0335a4082112e365bedab0b502cd989b3e7b38279101a148" + }, + { + "id": "spatial__hexbin-map__aggregate-geography-into-equal-hex-cells", + "type": "template", + "family": "spatial", + "intent": "aggregate geography into equal hex cells", + "path": "./templates/reference/spatial__hexbin-map__aggregate-geography-into-equal-hex-cells.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource" + ], + "datasources": [ + "federated.0arjs141tl66p81casjzd0kqj3kp" + ], + "fields": [ + { + "sourceField": "Abbreviation", + "datasource": "federated.0arjs141tl66p81casjzd0kqj3kp", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Calculation_0070936444309504", + "datasource": "federated.0arjs141tl66p81casjzd0kqj3kp", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Column", + "datasource": "federated.0arjs141tl66p81casjzd0kqj3kp", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "Row", + "datasource": "federated.0arjs141tl66p81casjzd0kqj3kp", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "aggregate", + "cells", + "equal", + "geography", + "hex", + "hexbin", + "into", + "map", + "reference", + "spatial", + "template" + ], + "sha256": "922cfd064c6a8bca390765edcb5181301534bef331b4228e7a4deb63873dcce1" + }, + { + "id": "spatial__proportional-symbol-map__map-totals-with-sized-marks-not-rates", + "type": "template", + "family": "spatial", + "intent": "map totals with sized marks not rates", + "path": "./templates/reference/spatial__proportional-symbol-map__map-totals-with-sized-marks-not-rates.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "federated.0v0o2ld10ici9p16hfr0a195sn24" + ], + "fields": [ + { + "sourceField": "Borough", + "datasource": "federated.0v0o2ld10ici9p16hfr0a195sn24", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Incident Zip", + "datasource": "federated.0v0o2ld10ici9p16hfr0a195sn24", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Number of Records", + "datasource": "federated.0v0o2ld10ici9p16hfr0a195sn24", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "map", + "marks", + "not", + "proportional", + "rates", + "reference", + "sized", + "spatial", + "symbol", + "template", + "totals", + "with" + ], + "sha256": "2b58670253a03d3ca0243c4a921d43e63762ba45978c4c2027454dd8ddec768a" + }, + { + "id": "spatial__scaled-cartogram__distort-geography-so-area-encodes-value", + "type": "template", + "family": "spatial", + "intent": "distort geography so area encodes value", + "path": "./templates/reference/spatial__scaled-cartogram__distort-geography-so-area-encodes-value.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "multiple-datasources", + "unresolved-field-reference" + ], + "datasources": [ + "Sample - EU Superstore", + "federated.1cil50k16r0j6o1feqp6r0ey3ij7", + "federated.1xrkpt21i8djik111hfxv1st3v4d" + ], + "fields": [ + { + "sourceField": "Calculation_5073656843848998948", + "datasource": "federated.1xrkpt21i8djik111hfxv1st3v4d", + "datatype": "integer", + "role": "measure", + "derivation": "User", + "shelf": "marks" + }, + { + "sourceField": "Geometry", + "datasource": "federated.1xrkpt21i8djik111hfxv1st3v4d", + "datatype": "spatial", + "role": "measure", + "derivation": "Collect", + "shelf": "marks" + }, + { + "sourceField": "name", + "datasource": "federated.1xrkpt21i8djik111hfxv1st3v4d", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "tilegramVa", + "datasource": "federated.1xrkpt21i8djik111hfxv1st3v4d", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "area", + "cartogram", + "distort", + "encodes", + "geography", + "reference", + "scaled", + "so", + "spatial", + "template", + "value" + ], + "sha256": "c6865ea619fec2e9002d6a9752a26db9b1df292cd94f9d3b428629c0337577f3" + }, + { + "id": "spatial__spike-map__show-magnitude-at-locations-with-height", + "type": "template", + "family": "spatial", + "intent": "show magnitude at locations with height", + "path": "./templates/reference/spatial__spike-map__show-magnitude-at-locations-with-height.tbm", + "tier": "reference", + "classificationReasons": [ + "connection-dependency", + "external-calculation-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "federated.1c4k6r40hod0qv1b98nix0a4vlle" + ], + "fields": [ + { + "sourceField": "Calculation_0070936783224837", + "datasource": "federated.1c4k6r40hod0qv1b98nix0a4vlle", + "datatype": "integer", + "role": "measure", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Calculation_0070936784482313", + "datasource": "federated.1c4k6r40hod0qv1b98nix0a4vlle", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Country Name", + "datasource": "federated.1c4k6r40hod0qv1b98nix0a4vlle", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Gender Inequality Index", + "datasource": "federated.1c4k6r40hod0qv1b98nix0a4vlle", + "datatype": "real", + "role": "measure", + "derivation": "Avg", + "shelf": "marks" + }, + { + "sourceField": "Longitude", + "datasource": "federated.1c4k6r40hod0qv1b98nix0a4vlle", + "datatype": "real", + "role": "measure", + "derivation": "None", + "shelf": "columns" + }, + { + "sourceField": "country-code", + "datasource": "federated.1c4k6r40hod0qv1b98nix0a4vlle", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "name", + "datasource": "federated.1c4k6r40hod0qv1b98nix0a4vlle", + "datatype": "string", + "role": "dimension", + "derivation": "Attribute", + "shelf": "marks" + }, + { + "sourceField": "region", + "datasource": "federated.1c4k6r40hod0qv1b98nix0a4vlle", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "sub-region", + "datasource": "federated.1c4k6r40hod0qv1b98nix0a4vlle", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + } + ], + "parameters": [], + "keywords": [ + "at", + "height", + "locations", + "magnitude", + "map", + "reference", + "show", + "spatial", + "spike", + "template", + "with" + ], + "sha256": "0d11f4e4d02f239e32df8b2d24d8d21582d78084adc227e9d4c9b9d8324105b5" + }, + { + "id": "spatial__symbol-map__place-sized-marks-at-coordinates", + "type": "template", + "family": "spatial", + "intent": "place sized marks at coordinates", + "path": "./templates/reference/spatial__symbol-map__place-sized-marks-at-coordinates.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency", + "inline-datasource", + "unresolved-field-reference" + ], + "datasources": [ + "Sample - EU Superstore" + ], + "fields": [ + { + "sourceField": "Country/Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Country/Region", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + }, + { + "sourceField": "Sales", + "datasource": "Sample - EU Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "State/Province", + "datasource": "Sample - EU Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "marks" + } + ], + "parameters": [], + "keywords": [ + "at", + "coordinates", + "map", + "marks", + "place", + "reference", + "sized", + "spatial", + "symbol", + "template" + ], + "sha256": "0cf05fe3a0bf74ea7f28bfadf793084f7c0421915ac31fcfd8861122dab93da4" + }, + { + "id": "table-calc", + "type": "example", + "family": null, + "intent": "table calc", + "path": "./examples/table-calc.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "calc", + "example", + "table" + ], + "sha256": "037d3fbeffebb4e3403dc617a07b7e0ce4047470445af3beec9a198f83c4130f" + }, + { + "id": "tableau-desktop-commands-reference", + "type": "reference", + "family": null, + "intent": "tableau desktop commands reference", + "path": "./references/tableau-desktop-commands-reference.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "commands", + "desktop", + "reference", + "tableau" + ], + "sha256": "9c625b4787cc394ffb340320ab20349a3936d777fff9ff52108ccc55b6060029" + }, + { + "id": "topn-table-calc-filter", + "type": "example", + "family": null, + "intent": "topn table calc filter", + "path": "./examples/topn-table-calc-filter.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "calc", + "example", + "filter", + "table", + "topn" + ], + "sha256": "d5aca4a6f24336cbe622ace5183bb5427f6e30637b47ba030f7afc0fb101343d" + }, + { + "id": "trend-line-chart", + "type": "template", + "family": null, + "intent": "trend line chart", + "path": "./templates/reference/trend-line-chart.tbm", + "tier": "reference", + "classificationReasons": [ + "unresolved-field-reference" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Order Date", + "datasource": "Sample - Superstore", + "datatype": "date", + "role": "dimension", + "derivation": "Month-Trunc", + "shelf": "columns" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "chart", + "line", + "reference", + "template", + "trend" + ], + "sha256": "36ec6b78594bd14261b7781036d3503b974c22f85da16106c2d724f02d7eed22" + }, + { + "id": "twb-example-index", + "type": "reference", + "family": null, + "intent": "twb example index", + "path": "./references/twb-example-index.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "example", + "index", + "reference", + "twb" + ], + "sha256": "1d17348d9d8ad3bc1b42ba0a0d964e168e6495528cf60b9abcc55c902a8e6cfe" + }, + { + "id": "workbook-schema-reference", + "type": "reference", + "family": null, + "intent": "workbook schema reference", + "path": "./references/workbook-schema-reference.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "reference", + "schema", + "workbook" + ], + "sha256": "46e08747887aabad0e70851c3d268f03158440dba5ec44a11bca55f9b58083b3" + }, + { + "id": "worksheet-bar-chart", + "type": "example", + "family": null, + "intent": "worksheet bar chart", + "path": "./examples/worksheet-bar-chart.json", + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": [ + "bar", + "chart", + "example", + "worksheet" + ], + "sha256": "744d327dcbfb29caf8050257f431951e087a1c90b28ab770febccf4fc763712e" + }, + { + "id": "ww-floating-bars", + "type": "template", + "family": null, + "intent": "ww floating bars", + "path": "./templates/reference/ww-floating-bars.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_GanttSize", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Min", + "shelf": "marks" + }, + { + "sourceField": "Calculation_OverUnder", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Customer Name", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Min", + "shelf": "columns" + } + ], + "parameters": [], + "keywords": [ + "bars", + "floating", + "reference", + "template", + "ww" + ], + "sha256": "84f6bc8dd08da082fe74beb5bbb660e252b73f841483a2c525867fdc4cb38519" + }, + { + "id": "ww-ou-arrow", + "type": "template", + "family": null, + "intent": "ww ou arrow", + "path": "./templates/reference/ww-ou-arrow.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_3985421010944000", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Calculation_3985421010944000", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Calculation_3985421012422657", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "marks" + }, + { + "sourceField": "Calculation_3985421141106695", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Over/Under Binary (copy)_3985421014155269", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Over/Under Binary (copy)_3985421014155269", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Super Bowl - Split 2", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Super Bowl - Split 2", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "arrow", + "ou", + "reference", + "template", + "ww" + ], + "sha256": "dae3dee74ad14ab81a889e5dde20c137614e147d69a06309b30f2b5c638ede07" + }, + { + "id": "ww-ou-diff", + "type": "template", + "family": null, + "intent": "ww ou diff", + "path": "./templates/reference/ww-ou-diff.tbm", + "tier": "reference", + "classificationReasons": [ + "external-calculation-dependency" + ], + "datasources": [ + "Sample - Superstore" + ], + "fields": [ + { + "sourceField": "Calculation_3985421010944000", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Calculation_3985421141106695", + "datasource": "Sample - Superstore", + "datatype": "string", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + }, + { + "sourceField": "Over/Under Binary (copy)_3985421014155269", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "columns" + }, + { + "sourceField": "Over/Under Binary (copy)_3985421014155269", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "reference-line" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "filters" + }, + { + "sourceField": "Profit", + "datasource": "Sample - Superstore", + "datatype": "real", + "role": "measure", + "derivation": "Sum", + "shelf": "rows" + }, + { + "sourceField": "Super Bowl - Split 2", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "filters" + }, + { + "sourceField": "Super Bowl - Split 2", + "datasource": "Sample - Superstore", + "datatype": "integer", + "role": "dimension", + "derivation": "None", + "shelf": "rows" + } + ], + "parameters": [], + "keywords": [ + "diff", + "ou", + "reference", + "template", + "ww" + ], + "sha256": "a831d3228f137d9182008123fed389e11c9cfba17222a52a443eb90792dfd936" + } + ] +} diff --git a/plugins/tableau/resources/examples/calculated-field.json b/plugins/tableau/resources/examples/calculated-field.json new file mode 100644 index 0000000..be2cfcf --- /dev/null +++ b/plugins/tableau/resources/examples/calculated-field.json @@ -0,0 +1,36 @@ +{ + "_description": "Add a calculated field (measure) to a datasource", + "_feature": "calculated-field", + "_usage": "Insert this node as a child of the target datasource node. Change name, caption, formula, role, type, and datatype to match your field.", + "example": { + "type": "column", + "attrs": { + "name": "[Calculation_20260303120000_001]", + "caption": "Profit Ratio", + "role": "measure", + "type": "quantitative", + "datatype": "real" + }, + "children": [ + { + "type": "calculation", + "attrs": { + "formula": "SUM([Profit]) / SUM([Sales])", + "class": "tableau" + } + } + ] + }, + "notes": { + "name_format": "[Calculation_YYYYMMDDHHMMSS_NNN] — must be unique within the datasource", + "role_values": ["dimension", "measure"], + "type_values": ["nominal", "ordinal", "quantitative"], + "datatype_values": ["string", "integer", "real", "boolean", "date", "datetime"], + "dimension_example": { + "role": "dimension", + "type": "nominal", + "datatype": "string", + "formula_example": "IF [Profit] > 0 THEN 'Profitable' ELSE 'Unprofitable' END" + } + } +} diff --git a/plugins/tableau/resources/examples/column-instance-naming.json b/plugins/tableau/resources/examples/column-instance-naming.json new file mode 100644 index 0000000..cabb551 --- /dev/null +++ b/plugins/tableau/resources/examples/column-instance-naming.json @@ -0,0 +1,71 @@ +{ + "_description": "Column instance naming conventions for rows, cols, and datasource-dependencies", + "_feature": "worksheet,encoding", + "naming_pattern": "[derivation:FieldName:typePivot]", + "derivation_values": { + "None": "No aggregation (dimensions)", + "Sum": "SUM aggregation", + "Avg": "AVERAGE aggregation", + "Min": "MIN aggregation", + "Max": "MAX aggregation", + "Count": "COUNT aggregation", + "CountD": "COUNTD aggregation", + "Median": "MEDIAN aggregation", + "Attr": "ATTR aggregation", + "Stdev": "Standard deviation", + "Var": "Variance", + "Year": "YEAR date part", + "Quarter": "QUARTER date part", + "Month": "MONTH date part", + "Day": "DAY date part", + "Week": "WEEK date part", + "TruncYear": "Date truncated to year", + "TruncQuarter": "Date truncated to quarter", + "TruncMonth": "Date truncated to month", + "TruncDay": "Date truncated to day" + }, + "type_pivot_values": { + "nk": "nominal-key (discrete dimension)", + "qk": "quantitative-key (continuous measure)", + "ok": "ordinal-key (ordered discrete)", + "nq": "nominal-quantitative (discrete measure — rare)" + }, + "examples": { + "discrete_dimension": { + "column": "[Category]", + "instance_name": "[none:Category:nk]", + "derivation": "None", + "type": "nominal", + "pivot": "key" + }, + "sum_measure": { + "column": "[Sales]", + "instance_name": "[sum:Sales:qk]", + "derivation": "Sum", + "type": "quantitative", + "pivot": "key" + }, + "year_date": { + "column": "[Order Date]", + "instance_name": "[yr:Order Date:ok]", + "derivation": "Year", + "type": "ordinal", + "pivot": "key" + }, + "truncated_month": { + "column": "[Order Date]", + "instance_name": "[tmo:Order Date:qk]", + "derivation": "TruncMonth", + "type": "quantitative", + "pivot": "key" + }, + "count_distinct": { + "column": "[Customer ID]", + "instance_name": "[ctd:Customer ID:qk]", + "derivation": "CountD", + "type": "quantitative", + "pivot": "key" + } + }, + "rows_cols_usage": "[datasourceId].[column-instance-name] — e.g. [federated.XXXX].[sum:Sales:qk]" +} diff --git a/plugins/tableau/resources/examples/dashboard-tiled.json b/plugins/tableau/resources/examples/dashboard-tiled.json new file mode 100644 index 0000000..25b007c --- /dev/null +++ b/plugins/tableau/resources/examples/dashboard-tiled.json @@ -0,0 +1,79 @@ +{ + "_description": "Minimal tiled dashboard with two worksheets side by side", + "_feature": "dashboard", + "dashboard": { + "type": "dashboard", + "attrs": { "name": "Overview Dashboard" }, + "children": [ + { + "type": "size", + "attrs": { + "sizing-mode": "fixed", + "minwidth": "1200", "maxwidth": "1200", + "minheight": "800", "maxheight": "800" + } + }, + { + "type": "zones", + "children": [ + { + "type": "zone", + "attrs": { + "id": 2, "x": 0, "y": 0, "w": 1200, "h": 800, + "type-v2": "layout-basic", + "layout-strategy-id": "flow" + }, + "children": [ + { + "type": "zone", + "attrs": { + "id": 3, "x": 0, "y": 0, "w": 1200, "h": 40, + "type-v2": "title" + } + }, + { + "type": "zone", + "attrs": { + "id": 4, "x": 0, "y": 40, "w": 600, "h": 760, + "type-v2": "visual", + "name": "Sheet 1" + } + }, + { + "type": "zone", + "attrs": { + "id": 5, "x": 600, "y": 40, "w": 600, "h": 760, + "type-v2": "visual", + "name": "Sheet 2" + } + } + ] + } + ] + } + ] + }, + "window": { + "type": "window", + "attrs": { "name": "Overview Dashboard", "class": "dashboard", "maximized": "true" }, + "children": [ + { + "type": "viewpoints", + "children": [ + { "type": "viewpoint", "attrs": { "name": "Sheet 1" } }, + { "type": "viewpoint", "attrs": { "name": "Sheet 2" } } + ] + }, + { "type": "active", "attrs": { "id": "-1" } } + ] + }, + "notes": { + "zone_id_uniqueness": "Zone IDs must be unique across all dashboards in the workbook. Find max existing ID first.", + "visual_zone_name": "The 'name' attribute on a visual zone must exactly match an existing worksheet name (case-sensitive).", + "fixed_sizing_requires_equal_min_max": "For sizing-mode='fixed', minwidth MUST equal maxwidth and minheight MUST equal maxheight. Otherwise Tableau fires a CheckSizeValidity LogicAssert (DashboardSizePresModelBuilder.cpp:180) and rejects the workbook load. Use sizing-mode='automatic' to allow ranges.", + "dashboard_window_viewpoints": "The element MUST contain a child holding one bare per included worksheet. Nesting full elements inside causes HasVisualDoc to fail in DashboardController_VisualControllers.cpp and the workbook load is rejected.", + "sizing_mode_values": ["automatic", "fixed", "range", "vscroll"], + "zone_type_values": ["layout-basic", "layout-flow", "visual", "text", "bitmap", "web", "filter", "paramctrl", "color", "shape", "size", "map", "title", "empty"], + "layout_strategy_values": ["basic", "free-form", "flow", "distribute-evenly", "trivial"] + } +} diff --git a/plugins/tableau/resources/examples/dashboard-validation-grid.json b/plugins/tableau/resources/examples/dashboard-validation-grid.json new file mode 100644 index 0000000..d45e52d --- /dev/null +++ b/plugins/tableau/resources/examples/dashboard-validation-grid.json @@ -0,0 +1,93 @@ +{ + "_description": "Multi-row before/after validation grid (3 rows × 2 cols of worksheets) using nested layout-flow row zones with explicit per-child coordinates in 100000-based percentages. Pattern extracted from a working production workbook ('Validation Comparison' dashboard). Use this when you want before/after side-by-side bar charts proving a datasource refactor preserved totals.", + "_feature": "dashboard", + "_when_to_use": "Need to lay out N pairs of worksheets in a tall grid where left column = 'before' and right column = 'after'. For simple side-by-side without rows, use dashboard-tiled.json instead.", + "dashboard": { + "type": "dashboard", + "attrs": { "enable-sort-zone-taborder": "true", "name": "Before vs After Validation" }, + "children": [ + { "type": "style" }, + { + "type": "size", + "attrs": { + "sizing-mode": "fixed", + "minwidth": "1400", "maxwidth": "1400", + "minheight": "1200", "maxheight": "1200" + } + }, + { + "type": "zones", + "children": [ + { + "_comment": "Outer layout-basic with full 100000x100000 percentage grid. All children use percentages, NOT pixels.", + "type": "zone", + "attrs": { "id": 200, "x": 0, "y": 0, "w": 100000, "h": 100000, "type-v2": "layout-basic" }, + "children": [ + { + "type": "zone", + "attrs": { "id": 201, "x": 0, "y": 0, "w": 100000, "h": 5000, "is-fixed": "true", "type-v2": "title" } + }, + { + "_comment": "Outer vertical flow holding the rows.", + "type": "zone", + "attrs": { "id": 202, "x": 0, "y": 5000, "w": 100000, "h": 95000, "type-v2": "layout-flow", "param": "vert" }, + "children": [ + { + "_comment": "Row 1: horizontal flow with two sheet zones (Sales · Before | Sales · After).", + "type": "zone", + "attrs": { "id": 210, "x": 0, "y": 5000, "w": 100000, "h": 31666, "type-v2": "layout-flow", "param": "horz" }, + "children": [ + { "type": "zone", "attrs": { "id": 211, "name": "Validate Sales · Before", "x": 0, "y": 5000, "w": 50000, "h": 31666 } }, + { "type": "zone", "attrs": { "id": 212, "name": "Validate Sales · After", "x": 50000, "y": 5000, "w": 50000, "h": 31666 } } + ] + }, + { + "type": "zone", + "attrs": { "id": 220, "x": 0, "y": 36666, "w": 100000, "h": 31667, "type-v2": "layout-flow", "param": "horz" }, + "children": [ + { "type": "zone", "attrs": { "id": 221, "name": "Validate Quantity · Before", "x": 0, "y": 36666, "w": 50000, "h": 31667 } }, + { "type": "zone", "attrs": { "id": 222, "name": "Validate Quantity · After", "x": 50000, "y": 36666, "w": 50000, "h": 31667 } } + ] + }, + { + "type": "zone", + "attrs": { "id": 230, "x": 0, "y": 68333, "w": 100000, "h": 31667, "type-v2": "layout-flow", "param": "horz" }, + "children": [ + { "type": "zone", "attrs": { "id": 231, "name": "Validate Profit · Before", "x": 0, "y": 68333, "w": 50000, "h": 31667 } }, + { "type": "zone", "attrs": { "id": 232, "name": "Validate Profit · After", "x": 50000, "y": 68333, "w": 50000, "h": 31667 } } + ] + } + ] + } + ] + } + ] + } + ] + }, + "window": { + "type": "window", + "attrs": { "name": "Before vs After Validation", "class": "dashboard", "maximized": "true" }, + "children": [ + { + "type": "viewpoints", + "children": [ + { "type": "viewpoint", "attrs": { "name": "Validate Sales · Before" } }, + { "type": "viewpoint", "attrs": { "name": "Validate Sales · After" } }, + { "type": "viewpoint", "attrs": { "name": "Validate Quantity · Before" } }, + { "type": "viewpoint", "attrs": { "name": "Validate Quantity · After" } }, + { "type": "viewpoint", "attrs": { "name": "Validate Profit · Before" } }, + { "type": "viewpoint", "attrs": { "name": "Validate Profit · After" } } + ] + }, + { "type": "active", "attrs": { "id": "-1" } } + ] + }, + "notes": { + "coordinate_system": "Inside row-wrapping layout-flow zones, child x/y/w/h use the 100000-based percentage coordinate system (h='31666' = 31.666% of parent height). The reference 'Validation Comparison' dashboard in the agentdemo finished workbook uses this convention. Pixel coords also work in flat layout-basic dashboards (see dashboard-tiled.json), but inside layout-flow rows, mismatched coordinate systems cause silent zone drops.", + "row_height_distribution": "Three equal rows of 31666/31667/31667 sum to 95000 to fit under the 5000-tall title. The 1-unit asymmetry handles 95000 not being divisible by 3.", + "fixed_sizing_requires_equal_min_max": "Same constraint as dashboard-tiled.json: for sizing-mode='fixed', min == max for both width and height.", + "viewpoint_per_sheet": " needs one per included worksheet. Bare leaves only — never nest elements.", + "verify_post_apply": "After tableau-apply-workbook, re-fetch with tableau-get-dashboard and count zones. If zones went down, your layout structure was rejected silently." + } +} diff --git a/plugins/tableau/resources/examples/dual-axis.json b/plugins/tableau/resources/examples/dual-axis.json new file mode 100644 index 0000000..58ef22e --- /dev/null +++ b/plugins/tableau/resources/examples/dual-axis.json @@ -0,0 +1,61 @@ +{ + "_description": "Dual-axis worksheet: two measures on the same axis using the + operator in the cols/rows shelf. Generates 3 panes (one per measure plus the combined-axes pane).", + "_feature": "dual-axis,encoding", + "shelf_expression": { + "_description": "Dual-axis cols shelf: sum both measures using + operator", + "_note": "The + operator on the shelf creates a dual axis. Both CI names must be distinct.", + "cols_content": "([federated.XXXX].[sum:Sales:qk]+[federated.XXXX].[sum:Profit:qk])" + }, + "column_instances": { + "_description": "Both column-instances go into datasource-dependencies", + "measure1": { + "type": "column-instance", + "attrs": { + "column": "[Sales]", + "derivation": "Sum", + "name": "[sum:Sales:qk]", + "pivot": "key", + "type": "quantitative" + } + }, + "measure2": { + "type": "column-instance", + "attrs": { + "column": "[Profit]", + "derivation": "Sum", + "name": "[sum:Profit:qk]", + "pivot": "key", + "type": "quantitative" + } + } + }, + "panes": { + "_description": "A dual-axis view generates 3 panes: pane id=1 (first measure), pane id=2 (second measure), and the combined-axes pane (id=3 with name='__combined_axes')", + "pane_1": { + "type": "pane", + "attrs": { "id": "1" }, + "children": [ + { "type": "mark", "attrs": { "class": "Bar" } } + ] + }, + "pane_2": { + "type": "pane", + "attrs": { "id": "2" }, + "children": [ + { "type": "mark", "attrs": { "class": "Line" } } + ] + }, + "combined_axes_pane": { + "_note": "This pane is auto-generated by Tableau for dual-axis. Do not manually add it.", + "type": "pane", + "attrs": { "id": "3", "name": "__combined_axes" } + } + }, + "notes": { + "shelf_format": "([ds].[ci1]+[ds].[ci2]) — parens + + operator, both CI references", + "vs_multi_measure": "Single axis multi-measure uses ([ds].[ci1]*[ds].[ci2]) with * operator", + "mark_class_per_pane": "Each pane can have its own mark class — pane 1 and 2 are independently configurable", + "synchronize_axes": "To synchronize Y axes: add synchronize-axis node in the view", + "combined_axes_pane": "The __combined_axes pane is auto-created; don't manually add it — Tableau will create it" + } +} diff --git a/plugins/tableau/resources/examples/encoding-pane-level.json b/plugins/tableau/resources/examples/encoding-pane-level.json new file mode 100644 index 0000000..426228d --- /dev/null +++ b/plugins/tableau/resources/examples/encoding-pane-level.json @@ -0,0 +1,32 @@ +{ + "_description": "Correct pane-level encoding placement for color, text, size, shape, lod. Encodings go in pane > encodings (NOT inside pane > view > mark — mark-level encodings get stripped by loadMetadataFromXml).", + "_feature": "encoding,color,mark,pane", + "full_pane_structure": { + "_description": "Complete pane showing correct encoding placement", + "type": "pane", + "attrs": { "id": "2", "selection-relaxation-option": "selection-relaxation-disallow" }, + "children": [ + { + "type": "view", + "children": [{ "type": "breakdown", "attrs": { "value": "auto" } }] + }, + { "type": "mark", "attrs": { "class": "Bar" } }, + { + "type": "encodings", + "children": [ + { "type": "color", "attrs": { "column": "[federated.XXXX].[none:Category:nk]" } }, + { "type": "size", "attrs": { "column": "[federated.XXXX].[sum:Profit:qk]" } }, + { "type": "text", "attrs": { "column": "[federated.XXXX].[sum:Sales:qk]" } }, + { "type": "lod", "attrs": { "column": "[federated.XXXX].[none:Region:nk]" } } + ] + } + ] + }, + "notes": { + "encoding_types": ["color", "size", "text", "shape", "lod", "tooltip", "path", "angle"], + "mark_class_values": ["Automatic", "Text", "Shape", "Bar", "GanttBar", "Line", "Area", "Circle", "Square", "Pie", "Polygon", "Heatmap", "Multipolygon"], + "schema_path": "PaneSpecification-G > PaneSpecification-MarkEncodings-G", + "WRONG_placement": "pane > view > mark > encoding — gets STRIPPED by loadMetadataFromXml", + "CORRECT_placement": "pane > encodings > [color|size|text|shape|lod|tooltip]" + } +} diff --git a/plugins/tableau/resources/examples/filter-categorical.json b/plugins/tableau/resources/examples/filter-categorical.json new file mode 100644 index 0000000..b17b394 --- /dev/null +++ b/plugins/tableau/resources/examples/filter-categorical.json @@ -0,0 +1,37 @@ +{ + "_description": "Add a categorical filter to a worksheet (include specific values)", + "_feature": "filter", + "filter": { + "type": "filter", + "attrs": { + "column": "[federated.XXXX].[[Segment]]", + "class": "categorical" + }, + "children": [ + { + "type": "groupfilter", + "attrs": { + "user:ui-enumeration": "exclusive", + "user:ui-marker": "enumerate", + "function": "union" + }, + "children": [ + { "type": "groupfilter", "attrs": { "function": "member", "level": "[Segment]", "member": "Consumer" } }, + { "type": "groupfilter", "attrs": { "function": "member", "level": "[Segment]", "member": "Corporate" } } + ] + } + ] + }, + "placement": "Insert as a child of the worksheet's table > view node", + "notes": { + "column_format": "[datasourceId].[[FieldName]] — note the double brackets around the field name", + "filter_class_values": ["categorical", "quantitative", "relative-date"], + "groupfilter_function_values": ["union", "member", "intersection", "except", "range", "filter", "level-members"], + "exclusive_vs_inclusive": "exclusive means 'show only these values', inclusive is not commonly used in TWB files", + "quantitative_filter_example": { + "class": "quantitative", + "column": "[federated.XXXX].[[Sales]]", + "children": [{ "type": "min", "content": "100" }, { "type": "max", "content": "10000" }] + } + } +} diff --git a/plugins/tableau/resources/examples/filter-relative-date.json b/plugins/tableau/resources/examples/filter-relative-date.json new file mode 100644 index 0000000..b832e90 --- /dev/null +++ b/plugins/tableau/resources/examples/filter-relative-date.json @@ -0,0 +1,82 @@ +{ + "_description": "Relative date filter on a date dimension. Uses class='relative-date' with a date-range node specifying anchor, period, and range units.", + "_feature": "filter,filter-relative-date", + "filter_last_n_days": { + "_description": "Show data for the last 30 days relative to today", + "_placement": "Inside worksheet > table > view node (sibling to datasources)", + "type": "filter", + "attrs": { + "column": "[federated.XXXX].[[Order Date]]", + "class": "relative-date" + }, + "children": [ + { + "type": "date-range", + "attrs": { + "anchor": "today", + "first-period": "-30", + "period-type": "days" + } + } + ] + }, + "filter_last_n_months": { + "_description": "Show data for the last 3 complete months", + "type": "filter", + "attrs": { + "column": "[federated.XXXX].[[Order Date]]", + "class": "relative-date" + }, + "children": [ + { + "type": "date-range", + "attrs": { + "anchor": "today", + "first-period": "-3", + "period-type": "months" + } + } + ] + }, + "filter_year_to_date": { + "_description": "Show data for the current year to date", + "type": "filter", + "attrs": { + "column": "[federated.XXXX].[[Order Date]]", + "class": "relative-date" + }, + "children": [ + { + "type": "date-range", + "attrs": { + "anchor": "today", + "first-period": "0", + "period-type": "years", + "to-date": "true" + } + } + ] + }, + "filter_date_range_absolute": { + "_description": "Absolute date range filter (fixed start/end dates)", + "type": "filter", + "attrs": { + "column": "[federated.XXXX].[[Order Date]]", + "class": "quantitative" + }, + "children": [ + { "type": "min", "content": "#2024-01-01#" }, + { "type": "max", "content": "#2024-12-31#" } + ] + }, + "notes": { + "column_format": "[datasourceId].[[FieldName]] — double brackets around field name", + "class_relative_date": "class='relative-date' for rolling/relative filters", + "period_type_values": ["days", "weeks", "months", "quarters", "years"], + "anchor_values": ["today", "now", "last-full-period"], + "first_period": "Negative = looking back (e.g., -30 = last 30 days); 0 = current period", + "to_date": "to-date='true' for YTD/MTD/QTD — truncates to start of current period", + "absolute_date_format": "Use #YYYY-MM-DD# format for date literals in min/max children", + "filter_placement": "Filters go inside the view node (worksheet > table > view), alongside datasource-dependencies" + } +} diff --git a/plugins/tableau/resources/examples/lod-fixed.json b/plugins/tableau/resources/examples/lod-fixed.json new file mode 100644 index 0000000..6f47bf9 --- /dev/null +++ b/plugins/tableau/resources/examples/lod-fixed.json @@ -0,0 +1,47 @@ +{ + "_description": "FIXED LOD expression: computes a value at a fixed granularity, independent of view dimensions. Place the calculated column in the datasource columns section.", + "_feature": "lod,calculated-field", + "column_in_datasource": { + "_description": "Define the FIXED LOD calculated field in the datasource > columns section", + "type": "column", + "attrs": { + "caption": "Total Sales per Customer", + "datatype": "real", + "name": "[Calculation_LOD_Fixed]", + "role": "measure", + "type": "quantitative" + }, + "children": [ + { + "type": "calculation", + "attrs": { + "class": "tableau", + "formula": "{ FIXED [Customer Name] : SUM([Sales]) }" + } + } + ] + }, + "column_instance_in_view": { + "_description": "Reference the LOD field in datasource-dependencies as a column-instance", + "type": "column-instance", + "attrs": { + "column": "[Calculation_LOD_Fixed]", + "derivation": "Sum", + "name": "[sum:Calculation_LOD_Fixed:qk]", + "pivot": "key", + "type": "quantitative" + } + }, + "lod_variants": { + "FIXED": "{ FIXED [Dim1], [Dim2] : AGG([Measure]) } — ignores view dims, computes at specified dims", + "INCLUDE": "{ INCLUDE [Dim] : AGG([Measure]) } — adds extra dim to view granularity", + "EXCLUDE": "{ EXCLUDE [Dim] : AGG([Measure]) } — removes a dim from view granularity" + }, + "notes": { + "formula_syntax": "{ FIXED [DimField] : AGG([Measure]) } — curly braces required", + "naming_convention": "[Calculation_LOD_Fixed] — use descriptive names with timestamp suffix in production", + "derivation": "LOD fields typically use Sum derivation in column-instance; the formula itself specifies the aggregation", + "context_filters": "Context filters (context='true') ARE respected by FIXED LOD; regular filters are not", + "FIXED_vs_INCLUDE_EXCLUDE": "FIXED ignores all view dimensions; INCLUDE/EXCLUDE modify view grain relatively" + } +} diff --git a/plugins/tableau/resources/examples/mark-encoding.json b/plugins/tableau/resources/examples/mark-encoding.json new file mode 100644 index 0000000..45f4238 --- /dev/null +++ b/plugins/tableau/resources/examples/mark-encoding.json @@ -0,0 +1,44 @@ +{ + "_description": "Configure mark type and color/text/detail encoding on a worksheet. Encodings go in pane > encodings (NOT inside pane > view > mark — that gets stripped by loadMetadataFromXml).", + "_feature": "mark,encoding,color", + "mark_node": { + "_placement": "Inside worksheet > table > panes > pane", + "type": "mark", + "attrs": { "class": "Bar" } + }, + "color_encoding": { + "_placement": "Inside worksheet > table > panes > pane > encodings (NOT inside mark node)", + "_warning": "WRONG placement: pane > view > mark > encoding — this gets stripped by loadMetadataFromXml", + "type": "encodings", + "children": [ + { + "type": "color", + "attrs": { "column": "[federated.XXXX].[none:Category:nk]" } + } + ] + }, + "full_pane_example": { + "_description": "Complete pane structure showing correct encoding placement", + "type": "pane", + "attrs": { "id": "2", "selection-relaxation-option": "selection-relaxation-disallow" }, + "children": [ + { "type": "view", "children": [{ "type": "breakdown", "attrs": { "value": "auto" } }] }, + { "type": "mark", "attrs": { "class": "Bar" } }, + { + "type": "encodings", + "children": [ + { "type": "color", "attrs": { "column": "[federated.XXXX].[none:Category:nk]" } }, + { "type": "text", "attrs": { "column": "[federated.XXXX].[sum:Sales:qk]" } }, + { "type": "lod", "attrs": { "column": "[federated.XXXX].[none:Region:nk]" } } + ] + } + ] + }, + "notes": { + "mark_class_values_PrimitiveType_ST": ["Automatic", "Text", "Shape", "Bar", "GanttBar", "Line", "Area", "Circle", "Square", "Pie", "Polygon", "Heatmap", "Multipolygon"], + "encoding_types_in_pane_encodings": ["color", "size", "text", "shape", "lod", "tooltip", "path", "angle"], + "color_format": "Hex values like #4e79a7", + "setting_mark_type": "Change the 'class' attribute on the mark node inside panes > pane", + "CRITICAL": "Encodings MUST be direct children of pane (inside an 'encodings' wrapper), NOT inside the mark node. Mark-level encodings are stripped by loadMetadataFromXml." + } +} diff --git a/plugins/tableau/resources/examples/parameter.json b/plugins/tableau/resources/examples/parameter.json new file mode 100644 index 0000000..000038e --- /dev/null +++ b/plugins/tableau/resources/examples/parameter.json @@ -0,0 +1,78 @@ +{ + "_description": "Parameter definition and usage in a calculated field. Parameters live in a special datasource named 'Parameters'. Reference with [Parameters].[Parameter N].", + "_feature": "parameter,calculated-field", + "parameter_datasource": { + "_description": "The Parameters datasource is a special built-in datasource. Add parameter columns to it.", + "type": "datasource", + "attrs": { + "name": "Parameters", + "inline": "true" + }, + "children": [ + { + "type": "column", + "attrs": { + "caption": "Top N", + "datatype": "integer", + "name": "[Parameter 1]", + "param-domain-type": "range", + "role": "measure", + "type": "quantitative", + "value": "10" + }, + "children": [ + { + "type": "calculation", + "attrs": { + "class": "tableau", + "formula": "10" + } + }, + { + "type": "range", + "attrs": { + "granularity": "1", + "max": "100", + "min": "1" + } + } + ] + } + ] + }, + "calc_using_parameter": { + "_description": "A calculated field in a regular datasource that references the parameter", + "type": "column", + "attrs": { + "caption": "Is Top N", + "datatype": "boolean", + "name": "[Calculation_TopN_Check]", + "role": "dimension", + "type": "nominal" + }, + "children": [ + { + "type": "calculation", + "attrs": { + "class": "tableau", + "formula": "RANK(SUM([Sales])) <= [Parameters].[Parameter 1]" + } + } + ] + }, + "parameter_types": { + "integer_range": { "datatype": "integer", "param-domain-type": "range", "min": "1", "max": "100" }, + "float_range": { "datatype": "real", "param-domain-type": "range", "min": "0.0", "max": "1.0" }, + "string_list": { "datatype": "string", "param-domain-type": "list" }, + "boolean": { "datatype": "boolean", "param-domain-type": "all" }, + "all_values": { "datatype": "integer", "param-domain-type": "all", "note": "No min/max/list constraint" } + }, + "notes": { + "datasource_name": "Parameters datasource name is ALWAYS exactly 'Parameters' (capital P)", + "column_name_format": "[Parameter 1], [Parameter 2], etc. — Tableau auto-numbers them", + "reference_in_calc": "[Parameters].[Parameter N] — always reference by datasource name + column name", + "value_attr": "Current parameter value is stored in the 'value' attribute of the column node", + "param_domain_type_values": ["all", "list", "range"], + "formula_attr": "The calculation formula just echoes the default value: formula='10' for default=10" + } +} diff --git a/plugins/tableau/resources/examples/reference-line.json b/plugins/tableau/resources/examples/reference-line.json new file mode 100644 index 0000000..b0f9f7e --- /dev/null +++ b/plugins/tableau/resources/examples/reference-line.json @@ -0,0 +1,56 @@ +{ + "_description": "Add an average reference line to a worksheet axis. The reference-line node goes inside a pane in the panes section.", + "_feature": "reference-line", + "reference_line_average": { + "_description": "Average reference line on a quantitative axis. Place inside the pane node in panes.", + "_placement": "worksheet > table > panes > pane > reference-line", + "type": "reference-line", + "attrs": { + "type": "average", + "column": "[federated.XXXX].[sum:Sales:qk]" + }, + "children": [ + { + "type": "label", + "attrs": { + "label-type": "value", + "format": "#,##0" + } + } + ] + }, + "reference_line_constant": { + "_description": "Constant reference line at a fixed value", + "type": "reference-line", + "attrs": { + "type": "constant", + "value": "10000", + "column": "[federated.XXXX].[sum:Sales:qk]" + }, + "children": [ + { + "type": "label", + "attrs": { + "label-type": "custom", + "label": "Target" + } + } + ] + }, + "reference_line_parameter": { + "_description": "Reference line using a parameter value", + "type": "reference-line", + "attrs": { + "type": "constant", + "column": "[federated.XXXX].[sum:Sales:qk]", + "param-column": "[Parameters].[Parameter 1]" + } + }, + "notes": { + "placement": "reference-line is a direct child of pane (inside panes section), NOT inside view", + "type_values_ReferenceLineType-ST": ["constant", "average", "median", "minimum", "maximum", "sum", "percentile", "quantile"], + "column_format": "[datasourceId].[column-instance-name] — same format as shelf references", + "label_type_values": ["value", "custom", "none"], + "scope": "One pane corresponds to one measure; add reference-line to the correct pane for the target measure" + } +} diff --git a/plugins/tableau/resources/examples/sort.json b/plugins/tableau/resources/examples/sort.json new file mode 100644 index 0000000..b92bf8a --- /dev/null +++ b/plugins/tableau/resources/examples/sort.json @@ -0,0 +1,25 @@ +{ + "_description": "Sort a dimension by a measure using a view-level sort node. This is the ONLY reliable sort method — CDP tabdoc:sort is unreliable and datasource-level sorts get stripped.", + "_feature": "sort,sort-computed", + "sort_node": { + "_placement": "Direct child of worksheet > table > view (sibling to datasources, filter, slices)", + "type": "sort", + "attrs": { + "column": "[federated.XXXX].[none:Sub-Category:nk]", + "using": "[federated.XXXX].[sum:Sales:qk]", + "class": "computed", + "direction": "DESC" + } + }, + "notes": { + "column": "The dimension column-instance being sorted", + "using": "The measure column-instance to sort by", + "class_values_Sort-G": ["computed", "manual", "natural", "alphabetic"], + "direction_values_SortDirection-ST": ["ASC", "DESC"], + "WRONG_placements": [ + "Inside column node in datasource-dependencies — stripped by loadMetadataFromXml", + "shelf-sort-deltas at table level — stripped by loadMetadataFromXml" + ], + "CDP_sort_command": "tabdoc:sort is unreliable — use workbook JSON view-level sort instead" + } +} diff --git a/plugins/tableau/resources/examples/table-calc.json b/plugins/tableau/resources/examples/table-calc.json new file mode 100644 index 0000000..b714482 --- /dev/null +++ b/plugins/tableau/resources/examples/table-calc.json @@ -0,0 +1,53 @@ +{ + "_description": "Table calculation with Compute Using configuration. The table-calc node goes inside the column-instance in datasource-dependencies, NOT at the worksheet level.", + "_feature": "table-calc,calculation", + "calc_field_in_datasource": { + "_description": "Step 1: Define the calculated field in the datasource columns section", + "type": "column", + "attrs": { + "caption": "Rank by Sales", + "datatype": "integer", + "name": "[Calculation_20260306190005]", + "role": "measure", + "type": "quantitative" + }, + "children": [ + { + "type": "calculation", + "attrs": { + "class": "tableau", + "formula": "RANK(SUM([Sales]))" + } + } + ] + }, + "column_instance_with_table_calc": { + "_description": "Step 2: Add column-instance in datasource-dependencies with table-calc child for Compute Using", + "_placement": "Inside worksheet > table > view > datasource-dependencies > datasource-dependency", + "type": "column-instance", + "attrs": { + "name": "[usr:Calculation_20260306190005:qk:2]", + "column": "[Calculation_20260306190005]", + "pivot": "key", + "type": "quantitative", + "derivation": "User" + }, + "children": [ + { + "type": "table-calc", + "attrs": { + "ordering-type": "Field", + "ordering-field": "[Sample - Superstore].[Sub-Category]" + } + } + ] + }, + "notes": { + "column_instance_naming": "usr: prefix (User derivation), :2 suffix (table calc instance ID)", + "ordering_type_values_OrderingType-ST": ["None", "Table", "TableCol", "Rows", "Columns", "Pane", "PaneCol", "RowInPane", "ColumnInPane", "CellInPane", "Field"], + "compute_using_table_down": "ordering-type: 'Rows'", + "compute_using_specific_field": "ordering-type: 'Field', ordering-field: '[ds].[field]'", + "common_table_calc_functions": ["INDEX()", "RANK()", "RUNNING_SUM()", "RUNNING_AVG()", "WINDOW_SUM()", "WINDOW_AVG()", "FIRST()", "LAST()", "LOOKUP()", "SIZE()", "TOTAL()"], + "CRITICAL": "table-calc config MUST be in the column-instance in datasource-dependencies. Worksheet-level table-calculations section gets STRIPPED by loadMetadataFromXml." + } +} diff --git a/plugins/tableau/resources/examples/topn-table-calc-filter.json b/plugins/tableau/resources/examples/topn-table-calc-filter.json new file mode 100644 index 0000000..dce60a1 --- /dev/null +++ b/plugins/tableau/resources/examples/topn-table-calc-filter.json @@ -0,0 +1,97 @@ +{ + "_description": "Top N per partition using Rank on Rows pattern. Uses INDEX() as both the row axis (discrete/ordinal) and filter (continuous/quantitative). Each partition (e.g., month) independently ranks its items. Native Top N filters (class=function) are unreliable through loadMetadataFromXml.", + "_feature": "filter,topn,table-calc,rank", + "step1_calc_field": { + "_description": "Define INDEX() calc field in datasource columns — serves as both rank display and filter", + "_placement": "Inside datasource > column definitions", + "type": "column", + "attrs": { + "caption": "Rank", + "datatype": "integer", + "name": "[Calculation_Rank]", + "role": "measure", + "type": "ordinal" + }, + "children": [ + { + "type": "calculation", + "attrs": { + "class": "tableau", + "formula": "INDEX()" + } + } + ] + }, + "step2a_column_instance_discrete": { + "_description": "Discrete (ordinal) column-instance for Rows shelf — creates rank partitions 1, 2, 3...", + "_placement": "Inside worksheet > table > view > datasource-dependencies", + "type": "column-instance", + "attrs": { + "name": "[usr:Calculation_Rank:ok:1]", + "column": "[Calculation_Rank]", + "pivot": "key", + "type": "ordinal", + "derivation": "User" + }, + "children": [ + { + "type": "table-calc", + "attrs": { + "ordering-type": "Field", + "level-address": "[DatasourceName].[none:Sub-Category:nk]" + } + } + ] + }, + "step2b_column_instance_continuous": { + "_description": "Continuous (quantitative) column-instance for Filter shelf — allows range filtering (max: 10)", + "_placement": "Inside worksheet > table > view > datasource-dependencies", + "type": "column-instance", + "attrs": { + "name": "[usr:Calculation_Rank:qk]", + "column": "[Calculation_Rank]", + "pivot": "key", + "type": "quantitative", + "derivation": "User" + }, + "children": [ + { + "type": "table-calc", + "attrs": { + "ordering-type": "Field", + "level-address": "[DatasourceName].[none:Sub-Category:nk]" + } + } + ] + }, + "step3_rows": { + "_description": "Put the discrete Rank on Rows, the dimension on Label encoding (NOT on Rows)", + "rows": "[DatasourceName].[usr:Calculation_Rank:ok:1]", + "label_encoding": { + "type": "text", + "attrs": { "column": "[DatasourceName].[none:Sub-Category:nk]" } + } + }, + "step4_filter": { + "_description": "Quantitative range filter on the continuous Rank CI — keeps ranks 1 through N", + "_placement": "Inside worksheet > table > view (sibling to datasources, datasource-dependencies)", + "type": "filter", + "attrs": { + "column": "[DatasourceName].[usr:Calculation_Rank:qk]", + "class": "quantitative", + "included-values": "in-range" + }, + "children": [ + { "type": "max", "content": "10" } + ] + }, + "notes": { + "why_two_column_instances": "The same INDEX() field needs two forms: discrete (ordinal, :ok:) on Rows creates partitions; continuous (quantitative, :qk) on Filter allows range comparisons. A quantitative filter on an ordinal CI is INVALID.", + "why_not_dimension_on_rows": "Putting the dimension (e.g., Sub-Category) on a shared Rows axis creates a union of all partitions' top N — not independent top N per partition. With Rank on Rows, each partition column independently fills rank positions.", + "why_not_boolean_index_le_10": "A separate INDEX() <= 10 boolean calc is unnecessary. The Rank field itself serves as both the display axis and the filter target. Using a separate boolean calc risks misaligned compute-using configs between the two INDEX() calculations.", + "level_address_vs_ordering_field": "Use level-address (not ordering-field) for Specific Dimensions mode. Maps to 'At the level' in the Table Calculation dialog.", + "filter_ci_suffix": "The filter CI may have no numeric suffix (just :qk). Tableau assigns suffixes; don't assume :2.", + "order_of_operations": "Table calc filters compute at step 9 (after sorts, FIXED LODs, dimension filters)", + "change_N": "To change the number of results, modify the max content value in the filter (e.g., '20' for top 20)" + } +} diff --git a/plugins/tableau/resources/examples/worksheet-bar-chart.json b/plugins/tableau/resources/examples/worksheet-bar-chart.json new file mode 100644 index 0000000..33fc67c --- /dev/null +++ b/plugins/tableau/resources/examples/worksheet-bar-chart.json @@ -0,0 +1,76 @@ +{ + "_description": "Minimal worksheet with a bar chart (dimension on rows, measure on cols)", + "_feature": "worksheet", + "worksheet": { + "type": "worksheet", + "attrs": { "name": "Sales by Category" }, + "children": [ + { + "type": "table", + "children": [ + { + "type": "view", + "children": [ + { + "type": "datasources", + "children": [ + { "type": "datasource", "attrs": { "name": "federated.XXXX" } } + ] + }, + { + "type": "datasource-dependencies", + "attrs": { "datasource": "federated.XXXX" }, + "children": [ + { + "type": "column-instance", + "attrs": { + "column": "[Category]", + "derivation": "None", + "name": "[none:Category:nk]", + "pivot": "key", + "type": "nominal" + } + }, + { + "type": "column-instance", + "attrs": { + "column": "[Sales]", + "derivation": "Sum", + "name": "[sum:Sales:qk]", + "pivot": "key", + "type": "quantitative" + } + } + ] + } + ] + }, + { + "type": "panes", + "children": [ + { + "type": "pane", + "attrs": { "id": "2", "selection-relaxation-option": "selection-relaxation-disallow" }, + "children": [ + { "type": "view", "children": [{ "type": "breakdown", "attrs": { "value": "auto" } }] }, + { "type": "mark", "attrs": { "class": "Automatic" } } + ] + } + ] + }, + { "type": "rows", "content": "[federated.XXXX].[none:Category:nk]" }, + { "type": "cols", "content": "[federated.XXXX].[sum:Sales:qk]" } + ] + } + ] + }, + "window": { + "type": "window", + "attrs": { "name": "Sales by Category", "class": "worksheet", "saved-hidden": "true", "maximized": "true" } + }, + "notes": { + "column_instance_naming": "[derivation:FieldName:typePivot] — derivation is the aggregation (None, Sum, Avg, etc.), typePivot is 'nk' for nominal-key, 'qk' for quantitative-key, 'ok' for ordinal-key", + "mark_class_values": ["Automatic", "Text", "Shape", "Bar", "Line", "Area", "Circle", "Square", "Pie", "GanttBar", "Polygon", "Heatmap"], + "rows_cols_format": "[datasourceId].[column-instance-name]" + } +} diff --git a/plugins/tableau/resources/provenance.json b/plugins/tableau/resources/provenance.json new file mode 100644 index 0000000..900c643 --- /dev/null +++ b/plugins/tableau/resources/provenance.json @@ -0,0 +1,21 @@ +{ + "schemaVersion": 1, + "sources": [ + { + "repo": "tableau/tableau-mcp", + "commit": "3e77dd40997a2ffcb89fb25fa40c9abc1ac59a71", + "imports": [ + { + "filename": "insights__bar_chart.tbm", + "upstreamPath": "src/desktop/data/templates/insights__bar_chart.tbm", + "sha256": "8bee7866c7b5b008d5385f8dcbbc8d8b5994818362f433735992c58ce095f022" + }, + { + "filename": "insights__line_chart.tbm", + "upstreamPath": "src/desktop/data/templates/insights__line_chart.tbm", + "sha256": "2e223555446c9f940e3ac5f869114d42b3f2a25f5526e9f6af3188d2b19aaf71" + } + ] + } + ] +} diff --git a/plugins/tableau/resources/references/corpus.json b/plugins/tableau/resources/references/corpus.json new file mode 100644 index 0000000..8dd6c58 --- /dev/null +++ b/plugins/tableau/resources/references/corpus.json @@ -0,0 +1,904 @@ +{ + "version": "2.0", + "description": "Tableau workbook transformation examples with XML diffs at multiple granularity levels", + "example_count": 62, + "examples": [ + { + "id": "experiment_20260105_162540_0", + "title": "New workbook", + "description": "New workbook", + "user_input": "New workbook", + "tags": [ + "create" + ], + "complexity": "medium", + "diff_lines": 63, + "timestamp": "2026-01-05", + "scope": "workbook", + "diff": "--- \"experiments\\\\experiment_20260105_162540_0\\\\workbook_before.twb\"\t2026-01-06 10:22:15.753673800 -0800\n+++ \"experiments\\\\experiment_20260105_162540_0\\\\workbook_after.twb\"\t2026-01-06 10:22:15.755671700 -0800\n@@ -5,9 +5,59 @@\n \n \n \n+ \n+ \n \n \n \n \n \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n \n \n \n \n \n \n+ \n+ \n+ \n \n \n- \n- \n+ [Sample - Superstore].[Latitude (generated)]\n+ [Sample - Superstore].[Longitude (generated)]\n
\n \n
\n" + }, + { + "id": "experiment_20260105_162635_8", + "title": "Add profit to the view", + "description": "Add profit to the view", + "user_input": "Add profit to the view", + "tags": [ + "view", + "create" + ], + "complexity": "simple", + "diff_lines": 33, + "timestamp": "2026-01-05", + "scope": "worksheet", + "diff": "--- \"experiments\\\\experiment_20260105_162635_8\\\\workbook_before.twb\"\t2026-01-06 10:22:15.535356500 -0800\n+++ \"experiments\\\\experiment_20260105_162635_8\\\\workbook_after.twb\"\t2026-01-06 10:22:15.531833800 -0800\n@@ -2903,7 +2903,9 @@\n \n \n \n+ \n \n+ \n \n \n \n@@ -2920,6 +2922,7 @@\n \n \n \n+ \n \n \n \n@@ -2950,6 +2953,11 @@\n \n \n \n+ \n+ \n+ \n+ \n+ \n \n \n
\n" + }, + { + "id": "experiment_20260105_162648_9", + "title": "Create a new sheet", + "description": "Create a new sheet", + "user_input": "Create a new sheet", + "tags": [ + "worksheet", + "create" + ], + "complexity": "medium", + "diff_lines": 63, + "timestamp": "2026-01-05", + "scope": "workbook", + "diff": "--- \"experiments\\\\experiment_20260105_162648_9\\\\workbook_before.twb\"\t2026-01-06 10:22:15.368165100 -0800\n+++ \"experiments\\\\experiment_20260105_162648_9\\\\workbook_after.twb\"\t2026-01-06 10:22:15.364173700 -0800\n@@ -2931,9 +2931,29 @@\n \n \n \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n \n \n \n@@ -476,6 +480,12 @@\n \n \n \n+ \n \n \n [World Indicators].[sum:Population 15-64:qk]\n" + }, + { + "id": "experiment_20260105_163403_57", + "title": "Change encoding to size", + "description": "Change encoding to size", + "user_input": "Change encoding to size", + "tags": [ + "size", + "encoding" + ], + "complexity": "simple", + "diff_lines": 21, + "timestamp": "2026-01-05", + "scope": "worksheet", + "diff": "--- \"experiments\\\\experiment_20260105_163403_57\\\\workbook_before.twb\"\t2026-01-06 10:22:15.466627200 -0800\n+++ \"experiments\\\\experiment_20260105_163403_57\\\\workbook_after.twb\"\t2026-01-06 10:22:15.468627000 -0800\n@@ -478,7 +478,7 @@\n \n \n \n- \n+ \n \n \n \n@@ -489,7 +489,7 @@\n \n \n [World Indicators].[sum:Population 15-64:qk]\n- [World Indicators].[yr:Year:ok]\n+ [World Indicators].[none:Year:qk]\n
\n \n
\n" + }, + { + "id": "experiment_20260105_163515_59", + "title": "switch to a text table", + "description": "switch to a text table", + "user_input": "switch to a text table", + "tags": [ + "switch" + ], + "complexity": "medium", + "diff_lines": 58, + "timestamp": "2026-01-05", + "scope": "worksheet", + "diff": "--- \"experiments\\\\experiment_20260105_163515_59\\\\workbook_before.twb\"\t2026-01-06 10:22:15.416446100 -0800\n+++ \"experiments\\\\experiment_20260105_163515_59\\\\workbook_after.twb\"\t2026-01-06 10:22:15.419442600 -0800\n@@ -461,16 +461,12 @@\n \n \n \n- \n \n+ \n \n \n \n- \n+ \n \n \n- [World Indicators].[sum:Population 15-64:qk]\n- [World Indicators].[none:Year:qk]\n+ [World Indicators].[none:Region:nk]\n+ [World Indicators].[yr:Year:ok]\n \n \n \n@@ -515,11 +510,6 @@\n \n \n \n- \n- \n- \n- \n- \n \n \n
\n" + }, + { + "id": "experiment_20260105_163523_60", + "title": "make it a set of pie charts", + "description": "make it a set of pie charts", + "user_input": "make it a set of pie charts", + "tags": [ + "chart" + ], + "complexity": "simple", + "diff_lines": 42, + "timestamp": "2026-01-05", + "scope": "worksheet", + "diff": "--- \"experiments\\\\experiment_20260105_163523_60\\\\workbook_before.twb\"\t2026-01-06 10:22:15.651200500 -0800\n+++ \"experiments\\\\experiment_20260105_163523_60\\\\workbook_after.twb\"\t2026-01-06 10:22:15.656197800 -0800\n@@ -472,19 +472,16 @@\n \n \n \n- \n+ \n \n- \n+ \n+ \n+ \n \n- \n \n \n- [World Indicators].[none:Region:nk]\n- [World Indicators].[yr:Year:ok]\n+ [World Indicators].[yr:Year:ok]\n+ \n \n \n \n@@ -510,6 +507,12 @@\n \n \n \n+ \n+ \n+ \n+ \n+ \n+ \n \n \n
\n" + }, + { + "id": "experiment_20260105_163531_61", + "title": "make a tree map", + "description": "make a tree map", + "user_input": "make a tree map", + "tags": [ + "chart" + ], + "complexity": "medium", + "diff_lines": 50, + "timestamp": "2026-01-05", + "scope": "worksheet", + "diff": "--- \"experiments\\\\experiment_20260105_163531_61\\\\workbook_before.twb\"\t2026-01-06 10:22:15.737707200 -0800\n+++ \"experiments\\\\experiment_20260105_163531_61\\\\workbook_after.twb\"\t2026-01-06 10:22:15.734706500 -0800\n@@ -470,17 +470,31 @@\n \n \n \n- \n+ \n \n- \n+ \n \n- \n- \n \n+ \n+ \n+ \n \n+ \n \n \n- [World Indicators].[yr:Year:ok]\n+ \n \n \n \n@@ -509,8 +523,7 @@\n \n \n \n- \n- \n+ \n \n \n \n" + }, + { + "id": "experiment_20260105_163540_62", + "title": "Close the workbook", + "description": "Close the workbook", + "user_input": "Close the workbook", + "tags": [], + "complexity": "simple", + "diff_lines": 12, + "timestamp": "2026-01-05", + "scope": "workbook", + "diff": "--- \"experiments\\\\experiment_20260105_163540_62\\\\workbook_before.twb\"\t2026-01-06 10:22:15.474705600 -0800\n+++ \"experiments\\\\experiment_20260105_163540_62\\\\workbook_after.twb\"\t2026-01-06 10:22:15.472708200 -0800\n@@ -500,7 +500,7 @@\n \n \n \n- \n+ \n \n \n \n" + }, + { + "id": "experiment_20260105_163544_63", + "title": "close the workbook", + "description": "close the workbook", + "user_input": "close the workbook", + "tags": [], + "complexity": "medium", + "diff_lines": 63, + "timestamp": "2026-01-05", + "scope": "workbook", + "diff": "--- \"experiments\\\\experiment_20260105_163544_63\\\\workbook_before.twb\"\t2026-01-06 10:22:15.615719600 -0800\n+++ \"experiments\\\\experiment_20260105_163544_63\\\\workbook_after.twb\"\t2026-01-06 10:22:15.613718900 -0800\n@@ -5,9 +5,59 @@\n \n \n \n+ \n+ \n \n \n \n \n \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n \n \n- ([federated.1nes5701jlp1e01ee2tb00mkmpcm].[none:GAGBKVGBIF:nk] / [federated.1nes5701jlp1e01ee2tb00mkmpcm].[none:NAHIDAAUIM:nk])\n+ \n \n
\n \n@@ -179,11 +179,6 @@\n \n \n
\n- \n- \n- \n- \n- \n
\n \n
\n" + }, + { + "id": "experiment_20260106_085359_18", + "title": "Removing an encoding", + "description": "Removing an encoding", + "user_input": "Removing an encoding", + "tags": [ + "encoding" + ], + "complexity": "simple", + "diff_lines": 32, + "timestamp": "2026-01-06", + "scope": "worksheet", + "diff": "--- \"experiments\\\\experiment_20260106_085359_18\\\\workbook_before.twb\"\t2026-01-06 10:22:15.784948500 -0800\n+++ \"experiments\\\\experiment_20260106_085359_18\\\\workbook_after.twb\"\t2026-01-06 10:22:15.786946300 -0800\n@@ -113,19 +113,13 @@\n \n \n \n- \n- \n \n \n \n \n \n \n- \n+ "}}},{"name":"analyticobjects_testv1_staples","relativePath":"product-tests/data/client/workbooks/visual_analysis/AnalyticObjects_TestV1_Staples.twb","features":["filter-categorical","encoding-color","reference-line","dual-axis"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"CONSUMER\"\"HOME OFFICE\"%all%\"SMALL BUSINESS\"\"CORPORATE\""},"reference-line":{"xml":""},"dual-axis":{"xml":""}}},{"name":"cloud-connect-code-coverage","relativePath":"product-tests/data/cloud_connect/scripts/code-coverage/Cloud Connect Code Coverage.twb","features":["sort","filter-categorical","filter-quantitative","encoding-color","encoding-space","table-calc","reference-line","filter-relative-date","dual-axis","parameter"],"snippets":{"sort":{"xml":"\"Salesforce\"\"GoogleSheets\"%all%"},"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"02"},"encoding-color":{"xml":"%null%\"PASS\"\"SKIPPED\"\"FAIL\"\"ERROR\""},"encoding-space":{"xml":""},"table-calc":{"xml":""},"reference-line":{"xml":""},"filter-relative-date":{"xml":""},"dual-axis":{"xml":"
\"DataSourceParser.cpp\"\"EmbeddingHelpers.cpp\"\"GoogleApiRequestor.cpp\"\"GoogleAnalyticsConnection.cpp\"\"GoogleAnalyticsConnectionConfig.cpp\"\"GoogleAnalyticsConnectionDescriptionPresModel_gen.cpp\"\"GoogleAnalyticsConnectionDescriptionSerializer.cpp\"\"GoogleAnalyticsConnectionHelpers.cpp\"\"GoogleAnalyticsDateRange.cpp\"\"GoogleAnalyticsFormatter.cpp\"\"GoogleAnalyticsFormatterHelpers.cpp\"\"GoogleAnalyticsModels.cpp\"\"GoogleAnalyticsPresModelBuilder.cpp\"\"GoogleAnalyticsProtocol.cpp\"\"GoogleAnalyticsProtocolHelpers.cpp\"\"IGoogleAnalyticsConnectionConfig.cpp\"\"ConnectGoogleAnalyticsDlg.cpp\"\"GoogleAnalyticsAreaWidget.cpp\""},"parameter":{"xml":""}}},{"name":"3.-calculations","relativePath":"product-tests/data/server/workbooks/3. Calculations.twb","features":["filter-categorical","encoding-color","reference-line","dual-axis"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"Crossings\"\"Wedgewood\"\"Hammock Isles\"\"Harbor Lakes\"\"Harbor Landing\"\"Eagles Nest\"\"Whiskey Point\"\"Waterford\"\"Wild Pines\"\"Egrets Landing\"\"The Hamptons\"\"Sandpiper\"\"Greenbriar\""},"reference-line":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"expected.upload-and-replace-extracts-fogbugz","relativePath":"tableau-1.3/src/unittest/actions/testdata/DataSourceActionsTest/expected.upload-and-replace-extracts-fogbugz.twb","features":["filter-categorical","encoding-color","encoding-shape"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"8.0.2\"\"8.0.1\"\"8.0.3\"\"8.0.4\"\"8.1\"\"8.1 SaaS\"\"9.0\"\"Undecided\""},"encoding-shape":{"xml":"\"Bug\"\"Backlog Item\""}}},{"name":"optimize-filters","relativePath":"tableau-1.3/src/unittest/actions/testdata/FilterActionsTest/optimize-filters.twb","features":["filter-categorical","filter-quantitative","filter-relative-date","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"#2004-03-27 00:00:00##2005-05-06 23:59:59#"},"filter-relative-date":{"xml":""},"parameter":{"xml":""}}},{"name":"setup.b33061","relativePath":"tableau-1.3/src/unittest/actions/testdata/FilterActionsTest/setup.B33061.twb","features":["filter-relative-date"],"snippets":{"filter-relative-date":{"xml":""}}},{"name":"setup.combo-filter","relativePath":"tableau-1.3/src/unittest/actions/testdata/FilterActionsTest/setup.combo-filter.twb","features":["filter-categorical","encoding-shape","dual-axis"],"snippets":{"filter-categorical":{"xml":""},"encoding-shape":{"xml":"\"[Time].[All Time].[1998].[Quarter 3]\""},"dual-axis":{"xml":"
[Starbucks_Cube].[Time].[Time]"}}},{"name":"expected.b9908.1","relativePath":"tableau-1.3/src/unittest/actions/testdata/OpenDocumentActionsTest/expected.B9908.1.twb","features":["filter-categorical","encoding-color","encoding-size"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"191215252815361134932626292022217801210331637727308918131435"},"encoding-size":{"xml":""}}},{"name":"expected.b9908.2","relativePath":"tableau-1.3/src/unittest/actions/testdata/OpenDocumentActionsTest/expected.B9908.2.twb","features":["filter-categorical","encoding-color","encoding-size"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"191215252815361134932626292022217801210331637727308918131435"},"encoding-size":{"xml":""}}},{"name":"expected.b9908","relativePath":"tableau-1.3/src/unittest/actions/testdata/OpenDocumentActionsTest/expected.B9908.twb","features":["filter-categorical","encoding-color","encoding-size"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"191215252815361134932626292022217801210331637727308918131435"},"encoding-size":{"xml":""}}},{"name":"setup.b9908","relativePath":"tableau-1.3/src/unittest/actions/testdata/OpenDocumentActionsTest/setup.B9908.twb","features":["encoding-size","encoding-color"],"snippets":{"encoding-size":{"xml":""},"encoding-color":{"xml":"19121525281536113493262629202"}}},{"name":"expected.0100_dashboard.source.target.parsed","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0100_Dashboard.source.target.parsed.twb","features":["encoding-color"],"snippets":{"encoding-color":{"xml":""}}},{"name":"expected.0100_dashboard.source.target","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0100_Dashboard.source.target.twb","features":["encoding-color"],"snippets":{"encoding-color":{"xml":""}}},{"name":"expected.0110_dashboard_filteraction.source.target.parsed","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0110_Dashboard_FilterAction.source.target.parsed.twb","features":["filter-categorical","encoding-color"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":""}}},{"name":"expected.0110_dashboard_filteraction.source.target","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0110_Dashboard_FilterAction.source.target.twb","features":["filter-categorical","encoding-color"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":""}}},{"name":"expected.0111_dashboard_filteraction_allfields.source.target.parsed","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0111_Dashboard_FilterAction_AllFields.source.target.parsed.twb","features":["filter-categorical","encoding-color"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":""}}},{"name":"expected.0111_dashboard_filteraction_allfields.source.target","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0111_Dashboard_FilterAction_AllFields.source.target.twb","features":["filter-categorical","encoding-color"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":""}}},{"name":"expected.0112_dashboard_filteraction_withfqdnfield.source.target.parsed","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0112_Dashboard_FilterAction_WithFqdnField.source.target.parsed.twb","features":["filter-categorical","encoding-color"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":""}}},{"name":"expected.0112_dashboard_filteraction_withfqdnfield.source.target","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0112_Dashboard_FilterAction_WithFqdnField.source.target.twb","features":["filter-categorical","encoding-color"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":""}}},{"name":"expected.0120_dashboard_urlaction.source.target.parsed","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0120_Dashboard_URLAction.source.target.parsed.twb","features":["encoding-color"],"snippets":{"encoding-color":{"xml":""}}},{"name":"expected.0120_dashboard_urlaction.source.target","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.0120_Dashboard_URLAction.source.target.twb","features":["encoding-color"],"snippets":{"encoding-color":{"xml":""}}},{"name":"expected.b138840.superstore_sales_english.superstore_sales_extract.1","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.B138840.Superstore_Sales_English.Superstore_Sales_Extract.1.twb","features":["filter-categorical","encoding-color","table-calc","parameter"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"2012201120102013"},"table-calc":{"xml":""},"parameter":{"xml":""}}},{"name":"expected.b138840.superstore_sales_english.superstore_sales_extract.2","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.B138840.Superstore_Sales_English.Superstore_Sales_Extract.2.twb","features":["filter-categorical","encoding-color","table-calc","parameter"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"2012201120102013"},"table-calc":{"xml":""},"parameter":{"xml":""}}},{"name":"expected.b138840.superstore_sales_english.superstore_sales_extract.disable-compression","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.B138840.Superstore_Sales_English.Superstore_Sales_Extract.disable-compression.twb","features":["filter-categorical","encoding-color","table-calc","parameter"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"2012201120102013"},"table-calc":{"xml":""},"parameter":{"xml":""}}},{"name":"expected.b138840.superstore_sales_english.superstore_sales_extract.hyper","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.B138840.Superstore_Sales_English.Superstore_Sales_Extract.hyper.twb","features":["filter-categorical","encoding-color","table-calc","parameter"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"2012201120102013"},"table-calc":{"xml":""},"parameter":{"xml":""}}},{"name":"expected.copystyles_shapeandcolorencodings.source.target.parsed","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.CopyStyles_ShapeAndColorEncodings.source.target.parsed.twb","features":["encoding-color","encoding-shape"],"snippets":{"encoding-color":{"xml":"412715"},"encoding-shape":{"xml":"412715"}}},{"name":"expected.copystyles_shapeandcolorencodings.source.target.reverted","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.CopyStyles_ShapeAndColorEncodings.source.target.reverted.twb","features":["encoding-shape","encoding-color"],"snippets":{"encoding-shape":{"xml":"412715"},"encoding-color":{"xml":"412715"}}},{"name":"expected.copystyles_shapeandcolorencodings.source.target","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.CopyStyles_ShapeAndColorEncodings.source.target.twb","features":["encoding-shape","encoding-color"],"snippets":{"encoding-shape":{"xml":"412715"},"encoding-color":{"xml":"412715"}}},{"name":"expected.dvpparameterpublishdatasource.source.target.parsed","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.DVPParameterPublishDatasource.source.target.parsed.twb","features":["encoding-color","parameter"],"snippets":{"encoding-color":{"xml":"\"[target].[sum:a_1:qk]\"\"[target]\"\"[target].[sum:b_1:qk]\""},"parameter":{"xml":""}}},{"name":"expected.dvpparameterpublishdatasource.source.target","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.DVPParameterPublishDatasource.source.target.twb","features":["encoding-color","parameter"],"snippets":{"encoding-color":{"xml":"\"[source].[sum:a:qk]\"\"[source]\"\"[source].[sum:b:qk]\""},"parameter":{"xml":""}}},{"name":"expected.dvpparameterreplacedatasource.source.target.parsed","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.DVPParameterReplaceDatasource.source.target.parsed.twb","features":["encoding-color","parameter"],"snippets":{"encoding-color":{"xml":"\"[target].[sum:a_1:qk]\"\"[target]\"\"[target].[sum:b_1:qk]\""},"parameter":{"xml":""}}},{"name":"expected.dvpparameterreplacedatasource.source.target.reverted","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.DVPParameterReplaceDatasource.source.target.reverted.twb","features":["encoding-color","parameter"],"snippets":{"encoding-color":{"xml":"\"[source].[sum:a:qk]\"\"[source]\"\"[source].[sum:b:qk]\""},"parameter":{"xml":""}}},{"name":"expected.dvpparameterreplacedatasource.source.target","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/expected.DVPParameterReplaceDatasource.source.target.twb","features":["encoding-color","parameter"],"snippets":{"encoding-color":{"xml":"\"[source].[sum:a:qk]\"\"[source]\"\"[source].[sum:b:qk]\""},"parameter":{"xml":""}}},{"name":"setup.b138840","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/setup.B138840.twb","features":["sort","filter-categorical","encoding-color","table-calc","parameter"],"snippets":{"sort":{"xml":"\"[Superstore_Sales_English].[pcto:sum:Profit:qk:1]\"\"[Superstore_Sales_English].[usr:Calculation_9100813121824802:qk]\"\"[Superstore_Sales_English].[usr:Calculation_1171006213822837:qk:4]\"\"[Superstore_Sales_English].[usr:Calculation_2880317170001117:qk]\""},"filter-categorical":{"xml":""},"encoding-color":{"xml":"2012201120102013"},"table-calc":{"xml":""},"parameter":{"xml":""}}},{"name":"setup.copystyles_shapeandcolorencodings","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/setup.CopyStyles_ShapeAndColorEncodings.twb","features":["encoding-shape","encoding-color"],"snippets":{"encoding-shape":{"xml":"412715"},"encoding-color":{"xml":"412715"}}},{"name":"setup.dvpparameterpublishdatasource","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/setup.DVPParameterPublishDatasource.twb","features":["encoding-color","parameter"],"snippets":{"encoding-color":{"xml":"\"[source].[sum:a:qk]\"\"[source]\"\"[source].[sum:b:qk]\""},"parameter":{"xml":""}}},{"name":"setup.dvpparameterreplacedatasource","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/setup.DVPParameterReplaceDatasource.twb","features":["encoding-color","parameter"],"snippets":{"encoding-color":{"xml":"\"[source].[sum:a:qk]\"\"[source]\"\"[source].[sum:b:qk]\""},"parameter":{"xml":""}}},{"name":"setup.storywithdeltas","relativePath":"tableau-1.3/src/unittest/actions/testdata/ReplaceDataSourceActionTest/setup.StoryWithDeltas.twb","features":["sort-computed","sort","filter-categorical","encoding-space"],"snippets":{"sort-computed":{"xml":""},"sort":{"xml":""},"filter-categorical":{"xml":""},"encoding-space":{"xml":""}}},{"name":"expected.combo-to-other-shelf","relativePath":"tableau-1.3/src/unittest/actions/testdata/ShelfActionsTest/expected.combo-to-other-shelf.twb","features":["encoding-shape","dual-axis"],"snippets":{"encoding-shape":{"xml":"\"Central\"\"South\"\"East\"\"West\""},"dual-axis":{"xml":"
"}}},{"name":"expected.drag-context-to-dual-axis","relativePath":"tableau-1.3/src/unittest/actions/testdata/ShelfActionsTest/expected.drag-context-to-dual-axis.twb","features":["filter-categorical","encoding-color","encoding-space","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"[dataengine.1hn0s871j2cdjq15f61xq1x2qhau].[avg:1 (copy):qk]\"\"[dataengine.1hn0s871j2cdjq15f61xq1x2qhau].[sum:1 (copy):qk]\"\"[dataengine.1hn0s871j2cdjq15f61xq1x2qhau].[sum:1 (copy):qk]:1\"\"[dataengine.1hn0s871j2cdjq15f61xq1x2qhau].[avg:Calculation_126382275261894656:qk]:1\"\"[dataengine.1hn0s871j2cdjq15f61xq1x2qhau].[avg:1 (copy):qk]:1\"\"[dataengine.1hn0s871j2cdjq15f61xq1x2qhau].[sum:Calculation_126382275261894656:qk]:1\"\"[dataengine.1hn0s871j2cdjq15f61xq1x2qhau].[avg:Calculation_126382275261894656:qk]\"\"[dataengine.1hn0s871j2cdjq15f61xq1x2qhau].[sum:Calculation_126382275261894656:qk]\""},"encoding-space":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"expected.drag-measure-to-column","relativePath":"tableau-1.3/src/unittest/actions/testdata/ShelfActionsTest/expected.drag-measure-to-column.twb","features":["encoding-color","encoding-space","reference-line","dual-axis","parameter"],"snippets":{"encoding-color":{"xml":"\"[dataengine.0coobiz0t9fidh1bl7v570vsbvsz].[avg:1 (copy):qk]\"\"[dataengine.0coobiz0t9fidh1bl7v570vsbvsz].[sum:1 (copy):qk]\"\"[dataengine.0coobiz0t9fidh1bl7v570vsbvsz].[sum:1 (copy):qk]:1\"\"[dataengine.0coobiz0t9fidh1bl7v570vsbvsz].[avg:Calculation_126382275261894656:qk]:1\"\"[dataengine.0coobiz0t9fidh1bl7v570vsbvsz].[avg:1 (copy):qk]:1\"\"[dataengine.0coobiz0t9fidh1bl7v570vsbvsz].[sum:Calculation_126382275261894656:qk]:1\"\"[dataengine.0coobiz0t9fidh1bl7v570vsbvsz].[avg:Calculation_126382275261894656:qk]\"\"[dataengine.0coobiz0t9fidh1bl7v570vsbvsz].[sum:Calculation_126382275261894656:qk]\""},"encoding-space":{"xml":""},"reference-line":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"setup.combo-to-other-shelf","relativePath":"tableau-1.3/src/unittest/actions/testdata/ShelfActionsTest/setup.combo-to-other-shelf.twb","features":["encoding-shape","dual-axis"],"snippets":{"encoding-shape":{"xml":"\"Central\"\"South\"\"East\"\"West\""},"dual-axis":{"xml":"
"}}},{"name":"setup.workbook.version.410.omeasures","relativePath":"tableau-1.3/src/unittest/parser/testdata/DocumentReadWriteTest/setup.workbook.version.410.omeasures.twb","features":["sort","encoding-color","encoding-shape"],"snippets":{"sort":{"xml":"\"[SUM(Budget Profit)]\"\"[SUM(Opening)]\"\"[SUM(Margin Rate)]\"\"[SUM(Ending)]\""},"encoding-color":{"xml":"\"[SUM(Budget Profit)]\"\"[SUM(Margin Rate)]\"\"[SUM(Ending)]\"\"[SUM(Opening)]\""},"encoding-shape":{"xml":"\"[SUM(Opening)]\"\"[SUM(Budget Profit)]\"\"[SUM(Margin Rate)]\"\"[SUM(Ending)]\""}}},{"name":"setup.workbook.version.64.from.61","relativePath":"tableau-1.3/src/unittest/parser/testdata/DocumentReadWriteTest/setup.workbook.version.64.from.61.twb","features":["sort","sort-computed","encoding-color","reference-line","dual-axis"],"snippets":{"sort":{"xml":"\"[Budget Profit]\"\"[AvgProfit]\"\"[Profit]\"\"[Budget Sales]\"\"[AvgSales]\"\"[Sales]\"%all%"},"sort-computed":{"xml":""},"encoding-color":{"xml":"\"Chamomile\"\"Decaf Irish Cream\"%all%\"Mint\"\"Lemon\"\"Decaf Espresso\""},"reference-line":{"xml":""},"dual-axis":{"xml":"
\"[Budget Profit]\"\"[AvgProfit]\"\"[Profit]\"\"[Budget Sales]\"\"[AvgSales]\"\"[Sales]\"%all%"}}},{"name":"setup.workbook.version.64.from.63","relativePath":"tableau-1.3/src/unittest/parser/testdata/DocumentReadWriteTest/setup.workbook.version.64.from.63.twb","features":["sort-computed","sort","encoding-color","reference-line","dual-axis"],"snippets":{"sort-computed":{"xml":""},"sort":{"xml":"\"Espresso\"\"Coffee\"\"Herbal Tea\"%all%"},"encoding-color":{"xml":"\"Chamomile\"\"Decaf Irish Cream\"%all%\"Mint\"\"Lemon\"\"Decaf Espresso\""},"reference-line":{"xml":""},"dual-axis":{"xml":"
\"[Budget Profit]\"\"[AvgProfit]\"\"[Profit]\"\"[Budget Sales]\"\"[AvgSales]\"\"[Sales]\"%all%"}}},{"name":"setup.workbook.version.71.from.70","relativePath":"tableau-1.3/src/unittest/parser/testdata/DocumentReadWriteTest/setup.workbook.version.71.from.70.twb","features":["encoding-color","encoding-shape","encoding-size"],"snippets":{"encoding-color":{"xml":"\"Central\"\"South\"\"West\"\"East\""},"encoding-shape":{"xml":"\"Central\"\"East\"\"South\"\"West\""},"encoding-size":{"xml":""}}},{"name":"setup.workbook.version.78.omeasures","relativePath":"tableau-1.3/src/unittest/parser/testdata/DocumentReadWriteTest/setup.workbook.version.78.omeasures.twb","features":["sort","filter-categorical","encoding-color","encoding-shape"],"snippets":{"sort":{"xml":"\"[sum:Additions:qk]\"\"[sum:Budget Additions:qk]\"\"[sum:Budget COGS:qk]\"\"[sum:Budget Margin:qk]\"\"[sum:Budget Payroll:qk]\"\"[sum:Budget Profit:qk]\"\"[sum:Budget Sales:qk]\"\"[sum:COGS:qk]\"\"[sum:Ending:qk]\"\"[sum:Inventory:qk]\"\"[sum:Item Count:qk]\"\"[sum:Margin Rate:qk]\"\"[sum:Marketing:qk]\"\"[sum:Misc:qk]\"\"[sum:Number of Records:qk]\"\"[sum:Margin:qk]\"\"[sum:Opening:qk]\""},"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"[sum:Profit Ratio:qk]\"\"[sum:Additions:qk]\"\"[sum:Total Expenses:qk]\"\"[sum:Budget Payroll:qk]\"\"[sum:Margin:qk]\"\"[sum:Margin Rate:qk]\"\"[sum:Inventory:qk]\"\"[sum:Budget Profit:qk]\"\"[sum:Sales:qk]\"\"[sum:Budget Additions:qk]\"\"[sum:Payroll:qk]\"\"[sum:Marketing:qk]\"\"[sum:Item Count:qk]\"\"[sum:Opening:qk]\""},"encoding-shape":{"xml":"\"[sum:Budget Payroll:qk]\"\"[sum:Margin:qk]\"\"[sum:Additions:qk]\"\"[sum:Margin Rate:qk]\"\"[sum:Total Expenses:qk]\"\"[sum:Budget Profit:qk]\"\"[sum:Opening:qk]\"\"[sum:COGS:qk]\"\"[sum:Profit:qk]\"\"[sum:Inventory:qk]\"\"[sum:Profit Ratio:qk]\"\"[sum:Budget COGS:qk]\"\"[sum:Misc:qk]\""}}},{"name":"dashboards","relativePath":"tableau-1.3/src/unittest/presentation-model/testdata/DashboardPresModelBuilderTest/dashboards.twb","features":["encoding-shape","dual-axis"],"snippets":{"encoding-shape":{"xml":"\"Coffee\"\"Espresso\"\"Herbal Tea\"\"Tea\""},"dual-axis":{"xml":"
"}}},{"name":"custom","relativePath":"tableau-1.3/src/unittest/presentation-model/testdata/TableCalculationPresModelBuilderTest/Custom.twb","features":["sort","encoding-color","table-calc","dual-axis","parameter"],"snippets":{"sort":{"xml":""},"encoding-color":{"xml":""},"table-calc":{"xml":"
"},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"boxplots","relativePath":"tableau-1.3/src/unittest/presentation-model/testdata/VisualPresModelBuilderTest/boxplots.twb","features":["encoding-shape","encoding-space","reference-line","dual-axis"],"snippets":{"encoding-shape":{"xml":"\"Columbian\"\"Earl Grey\"\"Amaretto\"\"Lemon\"\"Darjeeling\"\"Decaf Irish Cream\"\"Caffe Mocha\"\"Regular Espresso\"\"Green Tea\"\"Caffe Latte\"\"Mint\"\"Chamomile\"\"Decaf Espresso\""},"encoding-space":{"xml":""},"reference-line":{"xml":""},"dual-axis":{"xml":"
"}}},{"name":"setup.runtime_rendering","relativePath":"tableau-1.3/src/unittest/server/testdata/WorldUpdateGenerationTest/setup.runtime_rendering.twb","features":["filter-categorical","encoding-color","encoding-size-bar","encoding-space","reference-line","dual-axis"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"[Staples.dataengine].[none:Discount:qk]\"\"[Staples.dataengine].[sum:Discount:qk]\"\"[Staples.dataengine].[sum:Gross Profit:qk]\"\"[Staples.dataengine].[sum:Tax Rate:qk]\"\"[Staples.dataengine].[sum:Sales Total:qk]\"\"[Staples.dataengine].[sum:Price:qk]\""},"encoding-size-bar":{"xml":""},"encoding-space":{"xml":""},"reference-line":{"xml":""},"dual-axis":{"xml":"
([Starbucks (TestV1) MSSQL2008].[sum:Sales:qk] + [Starbucks (TestV1) MSSQL2008].[sum:Profit:qk])[Starbucks (TestV1) MSSQL2008].[none:State:nk]
"}}},{"name":"testtoggletrendlinecommand","relativePath":"testresources/platform/tabdoc/ToggleTrendLineTest/testToggleTrendLineCommand.twb","features":["filter-categorical","encoding-color","encoding-space","lod","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":""},"encoding-space":{"xml":""},"lod":{"xml":"0\r\n// calculates the profit at the order level\"/>"},"dual-axis":{"xml":""},"parameter":{"xml":""}}},{"name":"setup.measurenamesvalues","relativePath":"testresources/platform/tabdocclusteranalysis/SaveClusterToCatBinActionTest/setup.MeasureNamesValues.twb","features":["filter-categorical","encoding-color","encoding-shape"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"1-12"},"encoding-shape":{"xml":"\"[testDS].[sum:F7:qk]\"\"[testDS].[sum:F2:qk]\"\"[testDS].[sum:F8:qk]\"\"[testDS].[sum:F1:qk]\"\"[testDS].[sum:A1:qk]\"\"[testDS].[sum:F6:qk]\"\"[testDS].[sum:Number of Records:qk]\""}}},{"name":"evaluatedataalert-stacked-bars","relativePath":"testresources/platform/tabdocdataalert/EvaluateDataAlert-stacked-bars.twb","features":["sort","filter-categorical","encoding-color","encoding-space","encoding-size","reference-line","dual-axis","parameter"],"snippets":{"sort":{"xml":"\"Actual\"\"Estimate\""},"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"[testDS].[sum:Margin:qk]\"\"[testDS].[avg:Profit:qk]\"\"[testDS].[sum:Profit:qk]\"\"[testDS].[usr:Calculation_233905759205130240:qk]\"\"[testDS].[sum:Budget Profit:qk]\"\"[testDS].[sum:Total Expenses:qk]\"\"[testDS].[sum:Marketing:qk]\"\"[testDS].[sum:Budget Sales:qk]\"\"[testDS].[sum:Budget COGS:qk]\"\"[testDS].[sum:COGS:qk]\"\"[testDS]\"\"[testDS].[sum:Inventory:qk]\"\"[testDS].[sum:Sales:qk]\"\"[testDS].[sum:Number of Records:qk]\"\"[testDS].[sum:Budget Margin:qk]\""},"encoding-space":{"xml":""},"encoding-size":{"xml":""},"reference-line":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"superstore_manual_ffs_test_zones_and_marks","relativePath":"testresources/platform/tabdomtransforms/ResolveFeatureForksPerformanceTest/Superstore_Manual_FFS_Test_Zones_and_Marks.twb","features":["filter-quantitative","filter-categorical","encoding-color","encoding-space","encoding-size-bar","lod","table-calc","reference-line","parameter"],"snippets":{"filter-quantitative":{"xml":"#2014-01-03##2017-10-31#"},"filter-categorical":{"xml":""},"encoding-color":{"xml":""},"encoding-space":{"xml":""},"encoding-size-bar":{"xml":""},"lod":{"xml":"0\r\n// calculates the profit at the order level\"/>"},"table-calc":{"xml":""},"reference-line":{"xml":"\" label-type=\"custom\" scope=\"per-table\" value-column=\"[Sales Planning new].[max:OTE (Variable):qk]\" z-order=\"1\"/>"},"parameter":{"xml":""}}},{"name":"superstore_manual_ffs_test","relativePath":"testresources/platform/tabdomtransforms/ResolveFeatureForksPerformanceTest/Superstore_Manual_FFS_Test.twb","features":["filter-quantitative","filter-categorical","encoding-color","encoding-space","encoding-size-bar","lod","table-calc","reference-line"],"snippets":{"filter-quantitative":{"xml":"#2014-01-03##2017-10-31#"},"filter-categorical":{"xml":""},"encoding-color":{"xml":""},"encoding-space":{"xml":""},"encoding-size-bar":{"xml":""},"lod":{"xml":"0\r\n// calculates the profit at the order level\"/>"},"table-calc":{"xml":""},"reference-line":{"xml":"\" label-type=\"custom\" scope=\"per-table\" value-column=\"[Sales Planning new].[max:OTE (Variable):qk]\" z-order=\"1\"/>"}}},{"name":"ws-t03-sans-tn","relativePath":"testresources/platform/tabdomtransforms/StockDocumentLoadPerf/ws-T03-sans-TN.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-space","lod"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"0.0011.0"},"encoding-color":{"xml":"\"T1\"\"T2\""},"encoding-space":{"xml":""},"lod":{"xml":""}}},{"name":"workbookpdf","relativePath":"testresources/platform/tabrender/PDFRenderTest/WorkbookPDF.twb","features":["sort","sort-computed","filter-categorical","filter-quantitative","encoding-color","encoding-space","encoding-size","table-calc","reference-line"],"snippets":{"sort":{"xml":"\"Europe\"\"Middle East\"\"The Americas\"\"Oceania\"\"Asia\"\"Africa\""},"sort-computed":{"xml":""},"filter-categorical":{"xml":""},"filter-quantitative":{"xml":""},"encoding-color":{"xml":"\"Europe\"\"The Americas\"\"Africa\"\"Oceania\"\"Middle East\"\"Asia\""},"encoding-space":{"xml":""},"encoding-size":{"xml":""},"table-calc":{"xml":""},"reference-line":{"xml":"\" label-type=\"custom\" scope=\"per-pane\" value-column=\"[World Indicators new].[avg:F: GDP per capita (curr $):qk]\" z-order=\"1\"/>"}}},{"name":"setup.quicksortonclusters","relativePath":"testresources/platform/tabvizdata/ClusterInterpreterTest/setup.QuickSortOnClusters.twb","features":["sort"],"snippets":{"sort":{"xml":"567891011121314151617181920212223242526272829303132333435363738394041424344454647484950-10%all%1234"}}},{"name":"setup.shapelabelincell","relativePath":"testresources/platform/tabvizql/LabelLayoutEngineTest/setup.ShapeLabelInCell.twb","features":["sort","filter-categorical","encoding-color","encoding-shape","parameter"],"snippets":{"sort":{"xml":"\"Threshold\"\"Target\"\"Stretch\"\"Excellent\""},"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"[excel-direct.42452.692328738427].[attr:Actual Values:qk]\"\"[excel-direct.42452.692328738427].[sum:Actual Values:qk]\"\"[excel-direct.42452.692328738427].[attr:Cut-off Values:qk]\"\"[excel-direct.42452.692328738427].[sum:Cut-off Values:qk]\""},"encoding-shape":{"xml":"\"Projected\"\"Excellent\"\"Stretch\"\"Target\"\"Threshold\"\"YTD\"%null%\"Projection\""},"parameter":{"xml":""}}},{"name":"tupleselections","relativePath":"testresources/platform/tabvizqlmodel/TupleSelectionTest/TupleSelections.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-space","encoding-size","dual-axis"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"5468971647"},"encoding-color":{"xml":"\"SOUTH CAROLINA\"\"ALABAMA\"\"UTAH\"\"CONNECTICUT\"\"WISCONSIN\"\"NEW MEXICO\"\"MASS\"\"ILLINOIS\"\"DELAWARE\"\"TEXAS\"\"ARIZONA\"\"VIRGINIA\"\"NORTH CAROLINA\"\"MICHIGAN\"\"MARYLAND\""},"encoding-space":{"xml":""},"encoding-size":{"xml":""},"dual-axis":{"xml":"
"}}},{"name":"setup.b110299","relativePath":"testresources/platform/tabvizqlmodel/VisualSpecificationTest/setup.B110299.twb","features":["filter-categorical","filter-quantitative","encoding-color","reference-line","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"#2013-01-01##2013-12-31#"},"encoding-color":{"xml":"\"Bigorda, Sebastien\"\"Broussal, Cathy\"\"Friboulet, Helene\"\"Tambon, Magali\"\"Soudy, Milca\"\"Caruso, Karine\""},"reference-line":{"xml":""},"parameter":{"xml":""}}},{"name":"expected.support-title-visibility.93","relativePath":"testresources/platform/tabxmldom/UpdateDOMTest/expected.support-title-visibility.93.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-space","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":""},"encoding-color":{"xml":"\"[dataengine.1shhbkq1yyxt9q18sbi1q0pdi2e9].[avg:Discount:qk]\"\"[dataengine.1shhbkq1yyxt9q18sbi1q0pdi2e9].[sum:Sales:qk]\""},"encoding-space":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"expected.workbook-reference-lines.version.75","relativePath":"testresources/platform/tabxmldom/UpdateDOMTest/expected.workbook-reference-lines.version.75.twb","features":["reference-line"],"snippets":{"reference-line":{"xml":""}}},{"name":"setup.support-title-visibility.93","relativePath":"testresources/platform/tabxmldom/UpdateDOMTest/setup.support-title-visibility.93.twb","features":["sort","filter-categorical","filter-quantitative","encoding-color","encoding-space","dual-axis","parameter"],"snippets":{"sort":{"xml":"\"Actual\"\"Estimate\""},"filter-categorical":{"xml":""},"filter-quantitative":{"xml":""},"encoding-color":{"xml":"\"[dataengine.1shhbkq1yyxt9q18sbi1q0pdi2e9].[avg:Discount:qk]\"\"[dataengine.1shhbkq1yyxt9q18sbi1q0pdi2e9].[sum:Sales:qk]\""},"encoding-space":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"setup.workbook-reference-lines.version.75","relativePath":"testresources/platform/tabxmldom/UpdateDOMTest/setup.workbook-reference-lines.version.75.twb","features":["reference-line"],"snippets":{"reference-line":{"xml":""}}},{"name":"setup.titlesort","relativePath":"testresources/platform/titlecaption/setup.titlesort.twb","features":["sort","filter-categorical"],"snippets":{"sort":{"xml":"\"TECHNOLOGY\"\"FURNITURE\"\"OFFICE SUPPLIES\""},"filter-categorical":{"xml":""}}},{"name":"2017-01-10tennesseedashboard_he","relativePath":"testresources/tools/maxperftabsrv/OpenWorkbookTest/2017_01_10TennesseeDashboard/2017-01-10TennesseeDashboard_he.twb","features":["sort","sort-computed","filter-categorical","filter-quantitative","encoding-shape","encoding-color","encoding-space","lod","dual-axis","parameter"],"snippets":{"sort":{"xml":"\"All Industries\"\"Manufacturing\"\"Health Care and Social Assistance\"\"Educational Services\""},"sort-computed":{"xml":""},"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"10"},"encoding-shape":{"xml":"\"\"\" \""},"encoding-color":{"xml":"\"1\"\"0\"\"3\""},"encoding-space":{"xml":""},"lod":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"setup.b12706","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/bin/test/testFiles/SessionControllerIntegrationTests/setup.B12706.twb","features":["encoding-color","encoding-size-bar"],"snippets":{"encoding-color":{"xml":"\"Rock Rails\"\"6 Disk CD Autochanger\"\"Shifter Knob\"\"Auto-Dimming Mirror\"\"Wheel Locks\"\"Mudguards\"\"Emergency Assistance Kit\"\"Cargo Net\"\"Bkie Rack Attachment\"\"XM Satellite Radio\"\"Roof Rack\"\"All Weather Mats\"\"Ski/Snowboard Rack\"\"Read Spoiler\""},"encoding-size-bar":{"xml":""}}},{"name":"setup.b11136","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/bin/test/testFiles/WorksheetControllerIntegrationTests/setup.B11136.twb","features":["encoding-space","encoding-size"],"snippets":{"encoding-space":{"xml":""},"encoding-size":{"xml":""}}},{"name":"nonprofit-case-management---service-delivery-and-staff-capacity-2","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/main/bundles/nonprofitCloud/Nonprofit Case Management - Service Delivery and Staff Capacity 2.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-shape","encoding-space","lod","table-calc","reference-line","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"22"},"encoding-color":{"xml":"\"0034x000001a1ZjAAI\"\"0034x000001a1ZkAAI\"%null%\"0034x000001fzUoAAI\"\"0034x000001a19eAAA\"\"0034x000001fzUjAAI\"\"0034x000001fzUkAAI\""},"encoding-shape":{"xml":"\"0054x000000VfEAAA0\"\"0054x000000VfFnAAK\"\"0054x000000VfFoAAK\"\"0054x000000VfFyAAK\"\"0054x000001AMG5AAO\"\"0054x000001DBkeAAG\"\"0054x000001DBkjAAG\""},"encoding-space":{"xml":""},"lod":{"xml":""},"table-calc":{"xml":""},"reference-line":{"xml":"\" tooltip-type=\"custom\" value-column=\"[Parameters].[Parameter 13]\" z-order=\"1\"/>"},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"nonprofit-case-management-assessments","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/main/bundles/nonprofitCloud/Nonprofit Case Management Assessments.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-shape","encoding-space","lod","reference-line","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"0.10000000000000001149.0"},"encoding-color":{"xml":"%null%\"Intensive Case Management\"\"Housing\"\"Food Bank\"\"Job Training\"\"Basic Needs Support\""},"encoding-shape":{"xml":"\"Down\"\"Up\""},"encoding-space":{"xml":""},"lod":{"xml":""},"reference-line":{"xml":"\" tooltip-type=\"custom\" value-column=\"[Parameters].[Parameter 11]\" z-order=\"1\"/>"},"parameter":{"xml":""}}},{"name":"nonprofit-case-management-enrollment","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/main/bundles/nonprofitCloud/Nonprofit Case Management Enrollment.twb","features":["filter-categorical","encoding-color","encoding-space","encoding-size-bar","lod","parameter"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"0034x000001a1ZjAAI\"\"0034x000001a1ZkAAI\"%null%\"0034x000001fzUoAAI\"\"0034x000001a19eAAA\"\"0034x000001fzUjAAI\"\"0034x000001fzUkAAI\""},"encoding-space":{"xml":""},"encoding-size-bar":{"xml":""},"lod":{"xml":""},"parameter":{"xml":""}}},{"name":"nonprofit-case-management-intake","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/main/bundles/nonprofitCloud/Nonprofit Case Management Intake.twb","features":["filter-categorical","encoding-color","encoding-space","lod","table-calc","reference-line","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[usr:Count of Clients (Contacts) (copy)_3407325003432394752:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[avg:Mailing Longitude:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[none:Calculation_2736781199091818504:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[none:Calculation_3571424932197773332:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[none:Calculation_3571424932197851157:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[usr:Calculation_2736781199091552263:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[usr:Calculation_2736781199091965961:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[usr:Calculation_3571424931876982786:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[usr:Calculation_3571424931940556817:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[usr:Calculation_3571424932197715987:qk]\"\"[sqlproxy.1ugpe0c0g34gdq1frwo8w14pqhed].[usr:Calculation_3899765492620980230:qk]\""},"encoding-space":{"xml":""},"lod":{"xml":""},"table-calc":{"xml":""},"reference-line":{"xml":"\" tooltip-type=\"custom\" value-column=\"[Parameters].[Parameter 10]\" z-order=\"1\"/>"},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"nonprofit-fundraising-overview","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/main/bundles/nonprofitCloud/Nonprofit Fundraising Overview.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-shape","encoding-space","encoding-size","lod","table-calc","reference-line","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"0"},"encoding-color":{"xml":"%null%\"2017 Annual Fund\"\"September 2018 Email\"\"January Direct Mail Campaign 2020\"\"2019 Recurring Donor Campaign\"\"September 2019 Email\"\"Annual Campaign\"\"2020 Save Everything\"\"June 2018 Direct Mail\"\"2020 Love to Give\"\"2017 Recurring Donor Campaign\"\"2018 Annual Fund\"\"2019 Love to Give\"\"2020 Reactivation Campaign\"\"Summer 2019 New Donor Campaign\"\"Save Everything\"\"Love to Give\"\"2018 Love to Give\"\"2019 Save Everything\"\"2019 Annual Fund\"\"January Direct Mail Campaign 2019\""},"encoding-shape":{"xml":"truefalse"},"encoding-space":{"xml":""},"encoding-size":{"xml":""},"lod":{"xml":""},"table-calc":{"xml":""},"reference-line":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"sales-starters","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/main/bundles/salesCloud/Sales Starters.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-shape","encoding-space","encoding-size-bar","encoding-size","lod","table-calc","reference-line","filter-relative-date","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":""},"encoding-color":{"xml":"\"Services\"\"[sqlproxy.1mgnve31hfdv8l18qsoqk1r217ug].[usr:Calculation_5487143626518253569:qk]\"\"Add-On Business\"\"[sqlproxy.1mgnve31hfdv8l18qsoqk1r217ug].[usr:Calculation_5487143626518253569:qk]\"\"New Business\"\"[sqlproxy.1mgnve31hfdv8l18qsoqk1r217ug].[usr:Calculation_5487143626518253569:qk]\""},"encoding-shape":{"xml":"falsetrue"},"encoding-space":{"xml":""},"encoding-size-bar":{"xml":""},"encoding-size":{"xml":""},"lod":{"xml":""},"table-calc":{"xml":""},"reference-line":{"xml":""},"filter-relative-date":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"salesforce-admin-insights","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/main/bundles/salesforceAdminInsights/Salesforce Admin Insights.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-space","encoding-density-color","reference-line","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"0.0143.0"},"encoding-color":{"xml":"\"Recent\"\"Stale\"\"Semi-Recent\""},"encoding-space":{"xml":""},"encoding-density-color":{"xml":""},"reference-line":{"xml":""},"parameter":{"xml":""}}},{"name":"service-cloud-dashboard-starters","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/main/bundles/serviceCloud/Service Cloud Dashboard Starters.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-space","lod","reference-line","filter-relative-date","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":""},"encoding-color":{"xml":"\"[sqlproxy.1c5xvd105im52s1gqssd41kbafxk].[usr:Calculation_782218991018315779:qk]\"\"[sqlproxy.1c5xvd105im52s1gqssd41kbafxk].[sum:Value:qk]\"\"[sqlproxy.1c5xvd105im52s1gqssd41kbafxk].[avg:Response Time (mins):qk]\"\"[sqlproxy.1c5xvd105im52s1gqssd41kbafxk].[usr:Calculation_782218991018336261:qk]\""},"encoding-space":{"xml":""},"lod":{"xml":" \"Closed\" THEN 1 ELSE 0 END ) }\"/>"},"reference-line":{"xml":" hours\" tooltip-type=\"custom\" value-column=\"[sqlproxy.1c5xvd105im52s1gqssd41kbafxk].[avg:Calculation_1134907124392198144:qk]\" z-order=\"1\"/>"},"filter-relative-date":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"marketing_leads_expected","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/test/testFiles/WorkbookTransformerTest/Marketing_Leads_EXPECTED.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-size-bar","encoding-space","reference-line","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"#2017-09-28 21:36:52##2017-12-30 02:24:21#"},"encoding-color":{"xml":"truefalse"},"encoding-size-bar":{"xml":""},"encoding-space":{"xml":""},"reference-line":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"marketing_leads_template","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/test/testFiles/WorkbookTransformerTest/Marketing_Leads_TEMPLATE.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-size-bar","encoding-space","reference-line","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"#2017-09-28 21:36:52##2017-12-30 02:24:21#"},"encoding-color":{"xml":"truefalse"},"encoding-size-bar":{"xml":""},"encoding-space":{"xml":""},"reference-line":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"marketing_leads","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/bin/test/testFiles/WorkbookTransformerTest/Marketing_Leads.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-size-bar","encoding-space","reference-line","dual-axis","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"#2017-09-28 21:36:52##2017-12-30 02:24:21#"},"encoding-color":{"xml":"truefalse"},"encoding-size-bar":{"xml":""},"encoding-space":{"xml":""},"reference-line":{"xml":""},"dual-axis":{"xml":"
"},"parameter":{"xml":""}}},{"name":"salesforce-admin-insights","relativePath":"workgroup/src/silos/tableau-server/libraries/tab-domain-publishing-bundles/res/bundles/salesforceAdminInsights/Salesforce Admin Insights.twb","features":["filter-categorical","filter-quantitative","encoding-color","encoding-space","encoding-density-color","reference-line","parameter"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"0.0143.0"},"encoding-color":{"xml":"\"Recent\"\"Stale\"\"Semi-Recent\""},"encoding-space":{"xml":""},"encoding-density-color":{"xml":""},"reference-line":{"xml":""},"parameter":{"xml":""}}},{"name":"quickfilteroptions","relativePath":"workgroup/testing/workbooks/thin-client/QuickfilterOptions.twb","features":["filter-categorical","filter-quantitative","encoding-color","filter-relative-date"],"snippets":{"filter-categorical":{"xml":""},"filter-quantitative":{"xml":"55294328807"},"encoding-color":{"xml":"1998200419992005"},"filter-relative-date":{"xml":""}}},{"name":"viztypes8","relativePath":"workgroup/testing/workbooks/thin-client/viztypes8.twb","features":["filter-categorical","encoding-color","encoding-size-bar","encoding-space","reference-line","dual-axis"],"snippets":{"filter-categorical":{"xml":""},"encoding-color":{"xml":"\"[sqlserver.41248.593818761576].[sum:Gross Profit:qk]\"\"[sqlserver.41248.593818761576].[sum:Gross Profit:qk]:1\"\"[sqlserver.41248.593818761576].[sum:Item Count:qk]\"\"[sqlserver.41248.593818761576].[sum:Product Base Margin:qk]\"\"[sqlserver.41248.593818761576].[sum:Sales Total:qk]\""},"encoding-size-bar":{"xml":""},"encoding-space":{"xml":""},"reference-line":{"xml":""},"dual-axis":{"xml":"
+ + + + + + + + + + + + + + [Sample - Superstore].[sum:Profit:qk] + [Sample - Superstore].[none:Product Name:nk] +
+ diff --git a/plugins/tableau/resources/templates/executable/bullet-variance-chart.tbm b/plugins/tableau/resources/templates/executable/bullet-variance-chart.tbm new file mode 100644 index 0000000..f82c9ec --- /dev/null +++ b/plugins/tableau/resources/templates/executable/bullet-variance-chart.tbm @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[sum:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/change-over-time-area-chart.tbm b/plugins/tableau/resources/templates/executable/change-over-time-area-chart.tbm new file mode 100644 index 0000000..d322fd0 --- /dev/null +++ b/plugins/tableau/resources/templates/executable/change-over-time-area-chart.tbm @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[mn:Order Date:ok] + [Sample - Superstore].[yr:Order Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/executable/change-over-time-stacked-area-chart.tbm b/plugins/tableau/resources/templates/executable/change-over-time-stacked-area-chart.tbm new file mode 100644 index 0000000..4894f85 --- /dev/null +++ b/plugins/tableau/resources/templates/executable/change-over-time-stacked-area-chart.tbm @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[avg:Profit:qk] + [Sample - Superstore].[sum:Sales:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/correlation-dual-axis-chart.tbm b/plugins/tableau/resources/templates/executable/correlation-dual-axis-chart.tbm new file mode 100644 index 0000000..25a6e8a --- /dev/null +++ b/plugins/tableau/resources/templates/executable/correlation-dual-axis-chart.tbm @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ([Sample - Superstore].[sum:Profit:qk] + [Sample - Superstore].[avg:Sales:qk]) + [Sample - Superstore].[tmn:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/distribution-bar-code-chart.tbm b/plugins/tableau/resources/templates/executable/distribution-bar-code-chart.tbm new file mode 100644 index 0000000..57e7670 --- /dev/null +++ b/plugins/tableau/resources/templates/executable/distribution-bar-code-chart.tbm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[avg:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/funnel-chart.tbm b/plugins/tableau/resources/templates/executable/funnel-chart.tbm new file mode 100644 index 0000000..42bb90f --- /dev/null +++ b/plugins/tableau/resources/templates/executable/funnel-chart.tbm @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[sum:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/gantt-task-rollup-chart.tbm b/plugins/tableau/resources/templates/executable/gantt-task-rollup-chart.tbm new file mode 100644 index 0000000..b3a1cfd --- /dev/null +++ b/plugins/tableau/resources/templates/executable/gantt-task-rollup-chart.tbm @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/plugins/tableau/resources/templates/executable/magnitude-paired-bar.tbm b/plugins/tableau/resources/templates/executable/magnitude-paired-bar.tbm new file mode 100644 index 0000000..937e199 --- /dev/null +++ b/plugins/tableau/resources/templates/executable/magnitude-paired-bar.tbm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[yr:Order Date:ok] + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[sum:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/part-to-whole-pie-chart.tbm b/plugins/tableau/resources/templates/executable/part-to-whole-pie-chart.tbm new file mode 100644 index 0000000..adf5c9a --- /dev/null +++ b/plugins/tableau/resources/templates/executable/part-to-whole-pie-chart.tbm @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/plugins/tableau/resources/templates/executable/part-to-whole-stacked-bar-chart.tbm b/plugins/tableau/resources/templates/executable/part-to-whole-stacked-bar-chart.tbm new file mode 100644 index 0000000..0f8306b --- /dev/null +++ b/plugins/tableau/resources/templates/executable/part-to-whole-stacked-bar-chart.tbm @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[sum:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/part-to-whole-treemap-chart.tbm b/plugins/tableau/resources/templates/executable/part-to-whole-treemap-chart.tbm new file mode 100644 index 0000000..9578569 --- /dev/null +++ b/plugins/tableau/resources/templates/executable/part-to-whole-treemap-chart.tbm @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
diff --git a/plugins/tableau/resources/templates/executable/quota-attainment-bullet.tbm b/plugins/tableau/resources/templates/executable/quota-attainment-bullet.tbm new file mode 100644 index 0000000..a0de9fb --- /dev/null +++ b/plugins/tableau/resources/templates/executable/quota-attainment-bullet.tbm @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[sum:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/ranking-dot-strip-plot.tbm b/plugins/tableau/resources/templates/executable/ranking-dot-strip-plot.tbm new file mode 100644 index 0000000..77924c5 --- /dev/null +++ b/plugins/tableau/resources/templates/executable/ranking-dot-strip-plot.tbm @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[mn:Order Date:ok] + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[mn:Order Date:ok] + [Sample - Superstore].[sum:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/ranking-ordered-bar.tbm b/plugins/tableau/resources/templates/executable/ranking-ordered-bar.tbm new file mode 100644 index 0000000..ce60e4e --- /dev/null +++ b/plugins/tableau/resources/templates/executable/ranking-ordered-bar.tbm @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[sum:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/executable/ranking-ordered-column.tbm b/plugins/tableau/resources/templates/executable/ranking-ordered-column.tbm new file mode 100644 index 0000000..ff61c71 --- /dev/null +++ b/plugins/tableau/resources/templates/executable/ranking-ordered-column.tbm @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[sum:Profit:qk] + [Sample - Superstore].[none:Customer Name:nk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__area__emphasize-total-change-more-than-parts.tbm b/plugins/tableau/resources/templates/reference/change-over-time__area__emphasize-total-change-more-than-parts.tbm new file mode 100644 index 0000000..6107fb8 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__area__emphasize-total-change-more-than-parts.tbm @@ -0,0 +1,4237 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Region:nk]> + - <[Sample - EU Superstore].[tqr:Order Date:qk]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + [Sample - EU Superstore].[sum:Sales:qk] + [Sample - EU Superstore].[tqr:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__calendar-heatmap__reveal-daily-weekly-seasonal-patterns.tbm b/plugins/tableau/resources/templates/reference/change-over-time__calendar-heatmap__reveal-daily-weekly-seasonal-patterns.tbm new file mode 100644 index 0000000..1077d25 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__calendar-heatmap__reveal-daily-weekly-seasonal-patterns.tbm @@ -0,0 +1,4271 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[mn:Order Date:ok] + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[mn:Order Date:ok]> <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + [Sample - EU Superstore].[mn:Order Date:ok] + [Sample - EU Superstore].[yr:Order Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__candlestick__show-open-high-low-close-activity.tbm b/plugins/tableau/resources/templates/reference/change-over-time__candlestick__show-open-high-low-close-activity.tbm new file mode 100644 index 0000000..00e4a05 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__candlestick__show-open-high-low-close-activity.tbm @@ -0,0 +1,575 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [SP.csv] + + Count + true + + "UTF-8" + "en_GB" + "£" + "," + "true" + "en_GB" + "" + + + + Date + 133 + [Date] + [SP.csv] + Date + 0 + date + Year + true + [SP.csv_0561621678254F248CD8C5578F63C5D5] + + + Open + 5 + [Open] + [SP.csv] + Open + 1 + real + Sum + true + [SP.csv_0561621678254F248CD8C5578F63C5D5] + + + High + 5 + [High] + [SP.csv] + High + 2 + real + Sum + true + [SP.csv_0561621678254F248CD8C5578F63C5D5] + + + Low + 5 + [Low] + [SP.csv] + Low + 3 + real + Sum + true + [SP.csv_0561621678254F248CD8C5578F63C5D5] + + + Close + 5 + [Close] + [SP.csv] + Close + 4 + real + Sum + true + [SP.csv_0561621678254F248CD8C5578F63C5D5] + + + Adj Close + 5 + [Adj Close] + [SP.csv] + Adj Close + 5 + real + Sum + true + [SP.csv_0561621678254F248CD8C5578F63C5D5] + + + Volume + 20 + [Volume] + [SP.csv] + Volume + 6 + integer + Sum + true + [SP.csv_0561621678254F248CD8C5578F63C5D5] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0q5aijb1kryaw91eb1rim0uwj8p5].[dy:Date:ok] + + + + + + + + + + + + + + + + + + + + + SP + Æ + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[tdy:Date:qk]> + Æ + Lowest Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Low:qk]> + Æ + Highest Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:High:qk]> + Æ + Price Range: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[usr:Calculation_3464112593743679493:qk]> + Æ + Opening Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Open:qk]> + Æ + Closing Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Close:qk]> + Æ + Open vs Close Range: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[usr:Calculation_3464112593743745030:qk]> + + + + + + + + + + + + + + + + + + + + + + SP + Æ + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[tdy:Date:qk]> + Æ + Lowest Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Low:qk]> + Æ + Highest Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:High:qk]> + Æ + Price Range: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[usr:Calculation_3464112593743679493:qk]> + Æ + Opening Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Open:qk]> + Æ + Closing Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Close:qk]> + Æ + Open vs Close Range: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[usr:Calculation_3464112593743745030:qk]> + + + + + + + + + + + + + + + + + + + + + + + SP + Æ + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[tdy:Date:qk]> + Æ + Lowest Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Low:qk]> + Æ + Highest Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:High:qk]> + Æ + Price Range: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[usr:Calculation_3464112593743679493:qk]> + Æ + Opening Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Open:qk]> + Æ + Closing Price: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Close:qk]> + Æ + Open vs Close Range: + <[federated.0q5aijb1kryaw91eb1rim0uwj8p5].[usr:Calculation_3464112593743745030:qk]> + + + + + + ([federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Low:qk] + [federated.0q5aijb1kryaw91eb1rim0uwj8p5].[sum:Open:qk]) + [federated.0q5aijb1kryaw91eb1rim0uwj8p5].[tdy:Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__circle-timeline__show-sized-events-across-time-and-categories.tbm b/plugins/tableau/resources/templates/reference/change-over-time__circle-timeline__show-sized-events-across-time-and-categories.tbm new file mode 100644 index 0000000..4ec0504 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__circle-timeline__show-sized-events-across-time-and-categories.tbm @@ -0,0 +1,4346 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Region:nk]> + Æ + <[Sample - EU Superstore].[tmn:Order Date:qk]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Region:nk]> + Æ + <[Sample - EU Superstore].[tmn:Order Date:qk]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Region:nk]> + Æ + <[Sample - EU Superstore].[tmn:Order Date:qk]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + [Sample - EU Superstore].[none:Region:nk] + ([Sample - EU Superstore].[tmn:Order Date:qk] + [Sample - EU Superstore].[tmn:Order Date:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__column__show-one-series-changing-across-periods.tbm b/plugins/tableau/resources/templates/reference/change-over-time__column__show-one-series-changing-across-periods.tbm new file mode 100644 index 0000000..30d5e5e --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__column__show-one-series-changing-across-periods.tbm @@ -0,0 +1,1397 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>The standard way to compare the size of things. Must always start at 0 on the axis.</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Migrated Data] + + + Ship Date + 7 + [Ship Date] + [Orders] + Ship Date + 3 + date + Year + true + + "DATE" + + [Migrated Data] + + + Ship Mode + 130 + [Ship Mode] + [Orders] + Ship Mode + 4 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Country + 130 + [Country] + [Orders] + Country + 8 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + City + 130 + [City] + [Orders] + City + 9 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + State + 130 + [State] + [Orders] + State + 10 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Postal Code + 20 + [Postal Code] + [Orders] + Postal Code + 11 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Region + 130 + [Region] + [Orders] + Region + 12 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 13 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Category + 130 + [Category] + [Orders] + Category + 14 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 15 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 16 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Sales + 5 + [Sales] + [Orders] + Sales + 17 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 18 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Discount + 5 + [Discount] + [Orders] + Discount + 19 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Profit + 5 + [Profit] + [Orders] + Profit + 20 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U9995:no:A1:U9995:0" + true + 6 + + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ -1 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Row ID + 20 + [Row ID] + [Extract] + Row ID + 0 + Orders + integer + Sum + 9994 + true + [Migrated Data] + + + Order ID + 129 + [Order ID] + [Extract] + Order ID + 1 + Orders + string + Count + 3397 + true + + [Migrated Data] + + + Order Date + 133 + [Order Date] + [Extract] + Order Date + 2 + Orders + date + Year + 1373 + true + [Migrated Data] + + + Ship Date + 133 + [Ship Date] + [Extract] + Ship Date + 3 + Orders + date + Year + 1492 + true + [Migrated Data] + + + Ship Mode + 129 + [Ship Mode] + [Extract] + Ship Mode + 4 + Orders + string + Count + 4 + true + + [Migrated Data] + + + Customer ID + 129 + [Customer ID] + [Extract] + Customer ID + 5 + Orders + string + Count + 1128 + true + + [Migrated Data] + + + Customer Name + 129 + [Customer Name] + [Extract] + Customer Name + 6 + Orders + string + Count + 1128 + true + + [Migrated Data] + + + Segment + 129 + [Segment] + [Extract] + Segment + 7 + Orders + string + Count + 3 + true + + [Migrated Data] + + + Country + 129 + [Country] + [Extract] + Country + 8 + Orders + string + Count + 1 + true + + [Migrated Data] + + + City + 129 + [City] + [Extract] + City + 9 + Orders + string + Count + 566 + true + + [Migrated Data] + + + State + 129 + [State] + [Extract] + State + 10 + Orders + string + Count + 53 + true + + [Migrated Data] + + + Postal Code + 20 + [Postal Code] + [Extract] + Postal Code + 11 + Orders + integer + Sum + 676 + true + [Migrated Data] + + + Region + 129 + [Region] + [Extract] + Region + 12 + Orders + string + Count + 4 + true + + [Migrated Data] + + + Product ID + 129 + [Product ID] + [Extract] + Product ID + 13 + Orders + string + Count + 2000 + true + + [Migrated Data] + + + Category + 129 + [Category] + [Extract] + Category + 14 + Orders + string + Count + 3 + true + + [Migrated Data] + + + Sub-Category + 129 + [Sub-Category] + [Extract] + Sub-Category + 15 + Orders + string + Count + 17 + true + + [Migrated Data] + + + Product Name + 129 + [Product Name] + [Extract] + Product Name + 16 + Orders + string + Count + 1989 + true + + [Migrated Data] + + + Sales + 5 + [Sales] + [Extract] + Sales + 17 + Orders + real + Sum + 3494 + true + [Migrated Data] + + + Quantity + 20 + [Quantity] + [Extract] + Quantity + 18 + Orders + integer + Sum + 13 + true + [Migrated Data] + + + Discount + 5 + [Discount] + [Extract] + Discount + 19 + Orders + real + Sum + 11 + true + [Migrated Data] + + + Profit + 5 + [Profit] + [Extract] + Profit + 20 + Orders + real + Sum + 4049 + true + [Migrated Data] + + + + + + + + + + + + + + "Actual" + "Estimate" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[sum:Sales:qk] + [Sample - Superstore].[none:Region:nk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__connected-scatter__trace-two-metrics-evolving-together.tbm b/plugins/tableau/resources/templates/reference/change-over-time__connected-scatter__trace-two-metrics-evolving-together.tbm new file mode 100644 index 0000000..ce7beac --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__connected-scatter__trace-two-metrics-evolving-together.tbm @@ -0,0 +1,1369 @@ + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + Birth Rate + 5 + [Birth Rate] + [Extract] + Birth Rate + 0 + World Indicators.csv + real + Sum + 47 + true + [Migrated Data] + + + Business Tax Rate + 5 + [Business Tax Rate] + [Extract] + Business Tax Rate + 1 + World Indicators.csv + real + Sum + 397 + true + [Migrated Data] + + + CO2 Emissions + 20 + [CO2 Emissions] + [Extract] + CO2 Emissions + 2 + World Indicators.csv + integer + Sum + 1261 + true + [Migrated Data] + + + Country/Region + 129 + [Country/Region] + [Extract] + Country/Region + 3 + World Indicators.csv + string + Count + 208 + true + + [Migrated Data] + + + Days to Start Business + 20 + [Days to Start Business] + [Extract] + Days to Start Business + 4 + World Indicators.csv + integer + Sum + 115 + true + [Migrated Data] + + + Ease of Business + 20 + [Ease of Business] + [Extract] + Ease of Business + 5 + World Indicators.csv + integer + Sum + 334 + true + [Migrated Data] + + + Energy Usage + 20 + [Energy Usage] + [Extract] + Energy Usage + 6 + World Indicators.csv + integer + Sum + 1520 + true + [Migrated Data] + + + GDP + 20 + [GDP] + [Extract] + GDP + 7 + World Indicators.csv + integer + Sum + 1605 + true + [Migrated Data] + + + Health Exp % GDP + 5 + [Health Exp % GDP] + [Extract] + Health Exp % GDP + 8 + World Indicators.csv + real + Sum + 131 + true + [Migrated Data] + + + Health Exp/Capita + 20 + [Health Exp/Capita] + [Extract] + Health Exp/Capita + 9 + World Indicators.csv + integer + Sum + 836 + true + [Migrated Data] + + + Hours to do Tax + 20 + [Hours to do Tax] + [Extract] + Hours to do Tax + 10 + World Indicators.csv + integer + Sum + 262 + true + [Migrated Data] + + + Infant Mortality Rate + 5 + [Infant Mortality Rate] + [Extract] + Infant Mortality Rate + 11 + World Indicators.csv + real + Sum + 128 + true + [Migrated Data] + + + Internet Usage + 5 + [Internet Usage] + [Extract] + Internet Usage + 12 + World Indicators.csv + real + Sum + 617 + true + [Migrated Data] + + + Lending Interest + 5 + [Lending Interest] + [Extract] + Lending Interest + 13 + World Indicators.csv + real + Sum + 319 + true + [Migrated Data] + + + Life Expectancy Female + 20 + [Life Expectancy Female] + [Extract] + Life Expectancy Female + 14 + World Indicators.csv + integer + Sum + 48 + true + [Migrated Data] + + + Life Expectancy Male + 20 + [Life Expectancy Male] + [Extract] + Life Expectancy Male + 15 + World Indicators.csv + integer + Sum + 47 + true + [Migrated Data] + + + Mobile Phone Usage + 5 + [Mobile Phone Usage] + [Extract] + Mobile Phone Usage + 16 + World Indicators.csv + real + Sum + 950 + true + [Migrated Data] + + + Population 0-14 + 5 + [Population 0-14] + [Extract] + Population 0-14 + 17 + World Indicators.csv + real + Sum + 391 + true + [Migrated Data] + + + Population 15-64 + 5 + [Population 15-64] + [Extract] + Population 15-64 + 18 + World Indicators.csv + real + Sum + 287 + true + [Migrated Data] + + + Population 65+ + 5 + [Population 65+] + [Extract] + Population 65+ + 19 + World Indicators.csv + real + Sum + 199 + true + [Migrated Data] + + + Population Total + 20 + [Population Total] + [Extract] + Population Total + 20 + World Indicators.csv + integer + Sum + 2691 + true + [Migrated Data] + + + Population Urban + 5 + [Population Urban] + [Extract] + Population Urban + 21 + World Indicators.csv + real + Sum + 782 + true + [Migrated Data] + + + Region + 129 + [Region] + [Extract] + Region + 22 + World Indicators.csv + string + Count + 6 + true + + [Migrated Data] + + + Tourism Inbound + 20 + [Tourism Inbound] + [Extract] + Tourism Inbound + 23 + World Indicators.csv + integer + Sum + 1207 + true + [Migrated Data] + + + Tourism Outbound + 20 + [Tourism Outbound] + [Extract] + Tourism Outbound + 24 + World Indicators.csv + integer + Sum + 1082 + true + [Migrated Data] + + + Year + 133 + [Year] + [Extract] + Year + 25 + World Indicators.csv + date + Year + 13 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [World Indicators].[none:Country/Region:nk] + + + + + + + + + + + + + + + + + + + + <[World Indicators].[none:Country/Region:nk]>, <[World Indicators].[yr:Year:ok]> + Æ + GDP: + <[World Indicators].[sum:GDP:qk]> + Æ + Internet Usage: + <[World Indicators].[sum:Internet Usage:qk]> + + + + + + [World Indicators].[sum:GDP:qk] + [World Indicators].[sum:Internet Usage:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__dual-line__compare-two-time-series-directly.tbm b/plugins/tableau/resources/templates/reference/change-over-time__dual-line__compare-two-time-series-directly.tbm new file mode 100644 index 0000000..5e89df9 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__dual-line__compare-two-time-series-directly.tbm @@ -0,0 +1,4316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "[Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk]" + "[Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]" + + + + + + + [Sample - EU Superstore].[none:Category:nk] + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[mn:Order Date:ok]> + Æ + CY Sales: + <[Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]> + Æ + PY Sales: + <[Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk]> + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[mn:Order Date:ok]> + Æ + CY Sales: + <[Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]> + Æ + PY Sales: + <[Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk]> + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[mn:Order Date:ok]> + Æ + CY Sales: + <[Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]> + Æ + PY Sales: + <[Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk]> + + + + + + ([Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk] + [Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]) + [Sample - EU Superstore].[mn:Order Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__fan__show-forecast-uncertainty-widening-over-time.tbm b/plugins/tableau/resources/templates/reference/change-over-time__fan__show-forecast-uncertainty-widening-over-time.tbm new file mode 100644 index 0000000..4881f65 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__fan__show-forecast-uncertainty-widening-over-time.tbm @@ -0,0 +1,4239 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Sub-Category:nk] + + + + + + + + + + + + + + <[Sample - EU Superstore].[tqr:Order Date:qk]> + Æ + Total Profit: + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + [Sample - EU Superstore].[fVal:sum:Sales:qk] + [Sample - EU Superstore].[tmn:Order Date:qk] + +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__gantt__show-start-duration-and-overlap-of-tasks.tbm b/plugins/tableau/resources/templates/reference/change-over-time__gantt__show-start-duration-and-overlap-of-tasks.tbm new file mode 100644 index 0000000..18506be --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__gantt__show-start-duration-and-overlap-of-tasks.tbm @@ -0,0 +1,4276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #2025-12-22# + #2025-12-24# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Order Date:qk] + [Sample - EU Superstore].[none:Order ID:nk] + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Order ID:nk]> + Æ + <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Order Date: + <[Sample - EU Superstore].[tdy:Order Date:qk]> + Æ + Days to ship: + <[Sample - EU Superstore].[sum:Calculation_3464112593783345164:qk]> + Æ + <[Sample - EU Superstore].[usr:Late? (copy)_3464112593785438223:nk]> + + + + + + ([Sample - EU Superstore].[none:Order ID:nk] / [Sample - EU Superstore].[usr:Calculation_3464112593784180750:nk]) + [Sample - EU Superstore].[tdy:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__line-plus-area__combine-trend-line-with-filled-volume.tbm b/plugins/tableau/resources/templates/reference/change-over-time__line-plus-area__combine-trend-line-with-filled-volume.tbm new file mode 100644 index 0000000..f2524a5 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__line-plus-area__combine-trend-line-with-filled-volume.tbm @@ -0,0 +1,4306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "[Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk]" + "[Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]" + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[mn:Order Date:ok]> + Æ + CY Sales: + <[Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]> + Æ + PY Sales: + <[Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk]> + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[mn:Order Date:ok]> + Æ + CY Sales: + <[Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]> + Æ + PY Sales: + <[Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk]> + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[mn:Order Date:ok]> + Æ + CY Sales: + <[Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]> + Æ + PY Sales: + <[Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk]> + + + + + + ([Sample - EU Superstore].[sum:Calculation_1992279925712498703:qk] + [Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]) + [Sample - EU Superstore].[mn:Order Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__line-plus-column__pair-volume-columns-with-a-rate-line.tbm b/plugins/tableau/resources/templates/reference/change-over-time__line-plus-column__pair-volume-columns-with-a-rate-line.tbm new file mode 100644 index 0000000..3c1d3af --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__line-plus-column__pair-volume-columns-with-a-rate-line.tbm @@ -0,0 +1,1470 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Birth Rate + 5 + [Birth Rate] + [Extract] + Birth Rate + 0 + World Indicators.csv + real + Sum + 47 + true + [Migrated Data] + + + Business Tax Rate + 5 + [Business Tax Rate] + [Extract] + Business Tax Rate + 1 + World Indicators.csv + real + Sum + 397 + true + [Migrated Data] + + + CO2 Emissions + 20 + [CO2 Emissions] + [Extract] + CO2 Emissions + 2 + World Indicators.csv + integer + Sum + 1261 + true + [Migrated Data] + + + Country/Region + 129 + [Country/Region] + [Extract] + Country/Region + 3 + World Indicators.csv + string + Count + 208 + true + + [Migrated Data] + + + Days to Start Business + 20 + [Days to Start Business] + [Extract] + Days to Start Business + 4 + World Indicators.csv + integer + Sum + 115 + true + [Migrated Data] + + + Ease of Business + 20 + [Ease of Business] + [Extract] + Ease of Business + 5 + World Indicators.csv + integer + Sum + 334 + true + [Migrated Data] + + + Energy Usage + 20 + [Energy Usage] + [Extract] + Energy Usage + 6 + World Indicators.csv + integer + Sum + 1520 + true + [Migrated Data] + + + GDP + 20 + [GDP] + [Extract] + GDP + 7 + World Indicators.csv + integer + Sum + 1605 + true + [Migrated Data] + + + Health Exp % GDP + 5 + [Health Exp % GDP] + [Extract] + Health Exp % GDP + 8 + World Indicators.csv + real + Sum + 131 + true + [Migrated Data] + + + Health Exp/Capita + 20 + [Health Exp/Capita] + [Extract] + Health Exp/Capita + 9 + World Indicators.csv + integer + Sum + 836 + true + [Migrated Data] + + + Hours to do Tax + 20 + [Hours to do Tax] + [Extract] + Hours to do Tax + 10 + World Indicators.csv + integer + Sum + 262 + true + [Migrated Data] + + + Infant Mortality Rate + 5 + [Infant Mortality Rate] + [Extract] + Infant Mortality Rate + 11 + World Indicators.csv + real + Sum + 128 + true + [Migrated Data] + + + Internet Usage + 5 + [Internet Usage] + [Extract] + Internet Usage + 12 + World Indicators.csv + real + Sum + 617 + true + [Migrated Data] + + + Lending Interest + 5 + [Lending Interest] + [Extract] + Lending Interest + 13 + World Indicators.csv + real + Sum + 319 + true + [Migrated Data] + + + Life Expectancy Female + 20 + [Life Expectancy Female] + [Extract] + Life Expectancy Female + 14 + World Indicators.csv + integer + Sum + 48 + true + [Migrated Data] + + + Life Expectancy Male + 20 + [Life Expectancy Male] + [Extract] + Life Expectancy Male + 15 + World Indicators.csv + integer + Sum + 47 + true + [Migrated Data] + + + Mobile Phone Usage + 5 + [Mobile Phone Usage] + [Extract] + Mobile Phone Usage + 16 + World Indicators.csv + real + Sum + 950 + true + [Migrated Data] + + + Population 0-14 + 5 + [Population 0-14] + [Extract] + Population 0-14 + 17 + World Indicators.csv + real + Sum + 391 + true + [Migrated Data] + + + Population 15-64 + 5 + [Population 15-64] + [Extract] + Population 15-64 + 18 + World Indicators.csv + real + Sum + 287 + true + [Migrated Data] + + + Population 65+ + 5 + [Population 65+] + [Extract] + Population 65+ + 19 + World Indicators.csv + real + Sum + 199 + true + [Migrated Data] + + + Population Total + 20 + [Population Total] + [Extract] + Population Total + 20 + World Indicators.csv + integer + Sum + 2691 + true + [Migrated Data] + + + Population Urban + 5 + [Population Urban] + [Extract] + Population Urban + 21 + World Indicators.csv + real + Sum + 782 + true + [Migrated Data] + + + Region + 129 + [Region] + [Extract] + Region + 22 + World Indicators.csv + string + Count + 6 + true + + [Migrated Data] + + + Tourism Inbound + 20 + [Tourism Inbound] + [Extract] + Tourism Inbound + 23 + World Indicators.csv + integer + Sum + 1207 + true + [Migrated Data] + + + Tourism Outbound + 20 + [Tourism Outbound] + [Extract] + Tourism Outbound + 24 + World Indicators.csv + integer + Sum + 1082 + true + [Migrated Data] + + + Year + 133 + [Year] + [Extract] + Year + 25 + World Indicators.csv + date + Year + 13 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [World Indicators].[none:Country/Region:nk] + [World Indicators].[sum:CO2 Emissions:qk] + [World Indicators].[sum:GDP:qk] + + + + + + + + + + + + + + + + + + + + + <[World Indicators].[attr:Country/Region:nk]>, <[World Indicators].[yr:Year:ok]> + Æ + CO2 Emissions: + <[World Indicators].[sum:CO2 Emissions:qk]> + Æ + GDP: + <[World Indicators].[sum:GDP:qk]> + + + + + + + + + + + + + + + + + + + + <[World Indicators].[attr:Country/Region:nk]>, <[World Indicators].[yr:Year:ok]> + Æ + CO2 Emissions: + <[World Indicators].[sum:CO2 Emissions:qk]> + Æ + GDP: + <[World Indicators].[sum:GDP:qk]> + + + + + + + + + + + + + + + + + + + + <[World Indicators].[attr:Country/Region:nk]>, <[World Indicators].[yr:Year:ok]> + Æ + CO2 Emissions: + <[World Indicators].[sum:CO2 Emissions:qk]> + Æ + GDP: + <[World Indicators].[sum:GDP:qk]> + + + + + + ([World Indicators].[sum:GDP:qk] + [World Indicators].[sum:CO2 Emissions:qk]) + [World Indicators].[yr:Year:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__line__default-time-series-trend.tbm b/plugins/tableau/resources/templates/reference/change-over-time__line__default-time-series-trend.tbm new file mode 100644 index 0000000..8d5cc9f --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__line__default-time-series-trend.tbm @@ -0,0 +1,4225 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[tqr:Order Date:qk]> + Æ + Total Profit: + <[Sample - EU Superstore].[sum:Profit:qk]> + + + + + + [Sample - EU Superstore].[sum:Profit:qk] + [Sample - EU Superstore].[tqr:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__multi-line__compare-many-series-with-optional-highlight.tbm b/plugins/tableau/resources/templates/reference/change-over-time__multi-line__compare-many-series-with-optional-highlight.tbm new file mode 100644 index 0000000..786c018 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__multi-line__compare-many-series-with-optional-highlight.tbm @@ -0,0 +1,4240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Sub-Category:nk]> + Æ + <[Sample - EU Superstore].[tqr:Order Date:qk]> + Æ + 6-month moving average Sales: + Æ + <[Sample - EU Superstore].[win:sum:Sales:qk:8]> + + + + + + [Sample - EU Superstore].[win:sum:Sales:qk:8] + [Sample - EU Superstore].[tqr:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__ohlc__show-open-close-and-high-low-ranges.tbm b/plugins/tableau/resources/templates/reference/change-over-time__ohlc__show-open-close-and-high-low-ranges.tbm new file mode 100644 index 0000000..423b2d7 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__ohlc__show-open-close-and-high-low-ranges.tbm @@ -0,0 +1,450 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>Usually focused on day-to-day activity, these charts show opening/closing and hi/low points of each day.</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + Date + 7 + [Date] + [Stocks] + Date + 0 + date + Year + true + + "DATE" + + [Migrated Data] + + + Open + 5 + [Open] + [Stocks] + Open + 1 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + High + 5 + [High] + [Stocks] + High + 2 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Low + 5 + [Low] + [Stocks] + Low + 3 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Close + 5 + [Close] + [Stocks] + Close + 4 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Volume + 20 + [Volume] + [Stocks] + Volume + 5 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Stock + 130 + [Stock] + [Stocks] + Stock + 6 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + + 0 + [Stocks] + + Count + true + + 0 + "A1:G1995:no:A1:G1995:0" + true + 6 + + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + Date + 133 + [Date] + [Extract] + Date + 0 + Stocks + date + Year + 256 + true + [Migrated Data] + + + Open + 5 + [Open] + [Extract] + Open + 1 + Stocks + real + Sum + 1403 + true + [Migrated Data] + + + High + 5 + [High] + [Extract] + High + 2 + Stocks + real + Sum + 1404 + true + [Migrated Data] + + + Low + 5 + [Low] + [Extract] + Low + 3 + Stocks + real + Sum + 1377 + true + [Migrated Data] + + + Close + 5 + [Close] + [Extract] + Close + 4 + Stocks + real + Sum + 1390 + true + [Migrated Data] + + + Volume + 20 + [Volume] + [Extract] + Volume + 5 + Stocks + integer + Sum + 1994 + true + [Migrated Data] + + + Stock + 129 + [Stock] + [Extract] + Stock + 6 + Stocks + string + Count + 9 + true + + [Migrated Data] + + + + + + + + + + + + + "Actual" + "Estimate" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0mr55js0pwmp4611a4sho0rbgmji].[none:Stock:nk] + [federated.0mr55js0pwmp4611a4sho0rbgmji].[my:Date:ok] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ([federated.0mr55js0pwmp4611a4sho0rbgmji].[avg:Close:qk] + [federated.0mr55js0pwmp4611a4sho0rbgmji].[avg:Low:qk]) + [federated.0mr55js0pwmp4611a4sho0rbgmji].[tdy:Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__priestley-timeline__show-date-and-duration-of-intervals.tbm b/plugins/tableau/resources/templates/reference/change-over-time__priestley-timeline__show-date-and-duration-of-intervals.tbm new file mode 100644 index 0000000..4965fa8 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__priestley-timeline__show-date-and-duration-of-intervals.tbm @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>Great when date and duration are key elements of the story in the data.</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + 0 + [Composers.csv] + + Count + true + + "UTF-8" + "en_GB" + "£" + "" + "" + "," + "true" + "en_GB" + "" + + [Migrated Data] + + + name + 129 + [name] + [Composers.csv] + name + 0 + string + Count + 1 + 1073741823 + true + + [Migrated Data] + + + born + 133 + [born] + [Composers.csv] + born + 1 + date + Year + true + [Migrated Data] + + + died + 133 + [died] + [Composers.csv] + died + 2 + date + Year + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + name + 129 + [name] + [Extract] + name + 0 + Composers.csv + string + Count + 11 + true + + [Migrated Data] + + + born + 133 + [born] + [Extract] + born + 1 + Composers.csv + date + Year + 11 + true + [Migrated Data] + + + died + 133 + [died] + [Extract] + died + 2 + Composers.csv + date + Year + 11 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0gx040s1dzf8p31bd8azb1ew2wy2].[none:name:nk] + + + + + + + + + + + + + + + + + + + + [federated.0gx040s1dzf8p31bd8azb1ew2wy2].[none:name:nk] + [federated.0gx040s1dzf8p31bd8azb1ew2wy2].[tdy:born:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__seismogram__show-high-variance-series-as-mirrored-spikes.tbm b/plugins/tableau/resources/templates/reference/change-over-time__seismogram__show-high-variance-series-as-mirrored-spikes.tbm new file mode 100644 index 0000000..e9d65bb --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__seismogram__show-high-variance-series-as-mirrored-spikes.tbm @@ -0,0 +1,4273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[:Measure Names] + [Sample - EU Superstore].[yr:Order Date:ok] + [Sample - EU Superstore].[none:Category:nk] + [Sample - EU Superstore].[mn:Order Date:ok] + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[mn:Order Date:ok]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Calculation_3464112593755459591:qk]> + + + + + + [Sample - EU Superstore].[mn:Order Date:ok] + [Sample - EU Superstore].[Multiple Values] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__stacked-area__show-composition-changing-over-time.tbm b/plugins/tableau/resources/templates/reference/change-over-time__stacked-area__show-composition-changing-over-time.tbm new file mode 100644 index 0000000..31703e9 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__stacked-area__show-composition-changing-over-time.tbm @@ -0,0 +1,4192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Category:nk]> + Æ + % of Total + Æ + <[Sample - EU Superstore].[tqr:Order Date:qk]> + Æ + Sales: + <[Sample - EU Superstore].[pcto:sum:Sales:qk:4]> + + + + + + [Sample - EU Superstore].[pcto:sum:Sales:qk:4] + [Sample - EU Superstore].[tqr:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/change-over-time__steamgraph__show-organic-stacked-flows-over-time.tbm b/plugins/tableau/resources/templates/reference/change-over-time__steamgraph__show-organic-stacked-flows-over-time.tbm new file mode 100644 index 0000000..c66ad5f --- /dev/null +++ b/plugins/tableau/resources/templates/reference/change-over-time__steamgraph__show-organic-stacked-flows-over-time.tbm @@ -0,0 +1,4267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Sub-Category:nk] + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Sub-Category:nk]> + Æ + 9-month Moving Avg Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + [Sample - EU Superstore].[win:sum:Calculation_3464112593758343177:qk:67] + [Sample - EU Superstore].[tmn:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/connected-scatterplot.tbm b/plugins/tableau/resources/templates/reference/connected-scatterplot.tbm new file mode 100644 index 0000000..79274a4 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/connected-scatterplot.tbm @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[sum:Profit:qk] + [Sample - Superstore].[md:Order Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/correlation-highlight-table.tbm b/plugins/tableau/resources/templates/reference/correlation-highlight-table.tbm new file mode 100644 index 0000000..682d717 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/correlation-highlight-table.tbm @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Sub-Category:nk] + + + + + + + + + + + + + + + + + + [Sample - Superstore].[mn:Order Date:ok] + ([Sample - Superstore].[none:Customer Name:nk] / [Sample - Superstore].[yr:Order Date:ok]) +
+
diff --git a/plugins/tableau/resources/templates/reference/correlation-scatter-plot-chart.tbm b/plugins/tableau/resources/templates/reference/correlation-scatter-plot-chart.tbm new file mode 100644 index 0000000..241f191 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/correlation-scatter-plot-chart.tbm @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[sum:Sales:qk] + [Sample - Superstore].[sum:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/correlation__bubble-scatter__relate-two-measures-and-encode-a-third-by-size.tbm b/plugins/tableau/resources/templates/reference/correlation__bubble-scatter__relate-two-measures-and-encode-a-third-by-size.tbm new file mode 100644 index 0000000..a5d0045 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/correlation__bubble-scatter__relate-two-measures-and-encode-a-third-by-size.tbm @@ -0,0 +1,1395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Birth Rate + 5 + [Birth Rate] + [Extract] + Birth Rate + 0 + World Indicators.csv + real + Sum + 47 + true + [Migrated Data] + + + Business Tax Rate + 5 + [Business Tax Rate] + [Extract] + Business Tax Rate + 1 + World Indicators.csv + real + Sum + 397 + true + [Migrated Data] + + + CO2 Emissions + 20 + [CO2 Emissions] + [Extract] + CO2 Emissions + 2 + World Indicators.csv + integer + Sum + 1261 + true + [Migrated Data] + + + Country/Region + 129 + [Country/Region] + [Extract] + Country/Region + 3 + World Indicators.csv + string + Count + 208 + true + + [Migrated Data] + + + Days to Start Business + 20 + [Days to Start Business] + [Extract] + Days to Start Business + 4 + World Indicators.csv + integer + Sum + 115 + true + [Migrated Data] + + + Ease of Business + 20 + [Ease of Business] + [Extract] + Ease of Business + 5 + World Indicators.csv + integer + Sum + 334 + true + [Migrated Data] + + + Energy Usage + 20 + [Energy Usage] + [Extract] + Energy Usage + 6 + World Indicators.csv + integer + Sum + 1520 + true + [Migrated Data] + + + GDP + 20 + [GDP] + [Extract] + GDP + 7 + World Indicators.csv + integer + Sum + 1605 + true + [Migrated Data] + + + Health Exp % GDP + 5 + [Health Exp % GDP] + [Extract] + Health Exp % GDP + 8 + World Indicators.csv + real + Sum + 131 + true + [Migrated Data] + + + Health Exp/Capita + 20 + [Health Exp/Capita] + [Extract] + Health Exp/Capita + 9 + World Indicators.csv + integer + Sum + 836 + true + [Migrated Data] + + + Hours to do Tax + 20 + [Hours to do Tax] + [Extract] + Hours to do Tax + 10 + World Indicators.csv + integer + Sum + 262 + true + [Migrated Data] + + + Infant Mortality Rate + 5 + [Infant Mortality Rate] + [Extract] + Infant Mortality Rate + 11 + World Indicators.csv + real + Sum + 128 + true + [Migrated Data] + + + Internet Usage + 5 + [Internet Usage] + [Extract] + Internet Usage + 12 + World Indicators.csv + real + Sum + 617 + true + [Migrated Data] + + + Lending Interest + 5 + [Lending Interest] + [Extract] + Lending Interest + 13 + World Indicators.csv + real + Sum + 319 + true + [Migrated Data] + + + Life Expectancy Female + 20 + [Life Expectancy Female] + [Extract] + Life Expectancy Female + 14 + World Indicators.csv + integer + Sum + 48 + true + [Migrated Data] + + + Life Expectancy Male + 20 + [Life Expectancy Male] + [Extract] + Life Expectancy Male + 15 + World Indicators.csv + integer + Sum + 47 + true + [Migrated Data] + + + Mobile Phone Usage + 5 + [Mobile Phone Usage] + [Extract] + Mobile Phone Usage + 16 + World Indicators.csv + real + Sum + 950 + true + [Migrated Data] + + + Population 0-14 + 5 + [Population 0-14] + [Extract] + Population 0-14 + 17 + World Indicators.csv + real + Sum + 391 + true + [Migrated Data] + + + Population 15-64 + 5 + [Population 15-64] + [Extract] + Population 15-64 + 18 + World Indicators.csv + real + Sum + 287 + true + [Migrated Data] + + + Population 65+ + 5 + [Population 65+] + [Extract] + Population 65+ + 19 + World Indicators.csv + real + Sum + 199 + true + [Migrated Data] + + + Population Total + 20 + [Population Total] + [Extract] + Population Total + 20 + World Indicators.csv + integer + Sum + 2691 + true + [Migrated Data] + + + Population Urban + 5 + [Population Urban] + [Extract] + Population Urban + 21 + World Indicators.csv + real + Sum + 782 + true + [Migrated Data] + + + Region + 129 + [Region] + [Extract] + Region + 22 + World Indicators.csv + string + Count + 6 + true + + [Migrated Data] + + + Tourism Inbound + 20 + [Tourism Inbound] + [Extract] + Tourism Inbound + 23 + World Indicators.csv + integer + Sum + 1207 + true + [Migrated Data] + + + Tourism Outbound + 20 + [Tourism Outbound] + [Extract] + Tourism Outbound + 24 + World Indicators.csv + integer + Sum + 1082 + true + [Migrated Data] + + + Year + 133 + [Year] + [Extract] + Year + 25 + World Indicators.csv + date + Year + 13 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Bahrain" + "Iran" + "Iraq" + "Israel" + "Jordan" + "Kuwait" + "Lebanon" + "Oman" + "Qatar" + "Saudi Arabia" + "Syria" + "United Arab Emirates" + "Yemen" + + + + + + + + + [World Indicators].[none:Region:nk] + [World Indicators].[none:Country/Region:nk] + [World Indicators].[sum:CO2 Emissions:qk] + [World Indicators].[sum:GDP:qk] + + + + + + + + + + + + + + + + + + + + <[World Indicators].[none:Country/Region:nk]>, <[World Indicators].[yr:Year:ok]> + Æ + CO2 Emissions: + <[World Indicators].[sum:CO2 Emissions:qk]> + Æ + GDP: + <[World Indicators].[sum:GDP:qk]> + Æ + Population: + Æ + <[World Indicators].[sum:Population Total:qk]> + + + + + + [World Indicators].[sum:GDP:qk] + [World Indicators].[sum:CO2 Emissions:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/correlation__category-heatmap__show-patterns-across-two-categorical-axes.tbm b/plugins/tableau/resources/templates/reference/correlation__category-heatmap__show-patterns-across-two-categorical-axes.tbm new file mode 100644 index 0000000..ce090d8 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/correlation__category-heatmap__show-patterns-across-two-categorical-axes.tbm @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Population Data.csv] + + Count + true + + "UTF-8" + "en_GB" + "£" + "," + "true" + "en_GB" + "" + + + + Age Group + 129 + [Age Group] + [Population Data.csv] + Age Group + 0 + string + Count + 1 + 1073741823 + true + + [Population Data.csv_EF62FD7779BC4604B7232FB369021EF8] + + + Income Bracket + 129 + [Income Bracket] + [Population Data.csv] + Income Bracket + 1 + string + Count + 1 + 1073741823 + true + + [Population Data.csv_EF62FD7779BC4604B7232FB369021EF8] + + + Est. Population + 20 + [Est. Population] + [Population Data.csv] + Est. Population + 2 + integer + Sum + true + [Population Data.csv_EF62FD7779BC4604B7232FB369021EF8] + + + Trend Note + 129 + [Trend Note] + [Population Data.csv] + Trend Note + 3 + string + Count + 1 + 1073741823 + true + + [Population Data.csv_EF62FD7779BC4604B7232FB369021EF8] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Age Group: + <[federated.0y7zfam0ipwbfv122vvev1ykr655].[none:Age Group:nk]> + Æ + Income Bracket: + <[federated.0y7zfam0ipwbfv122vvev1ykr655].[none:Income Bracket:nk]> + Æ + % of Total Population: + <[federated.0y7zfam0ipwbfv122vvev1ykr655].[pcto:sum:Est. Population:qk:2]> + Æ + Population: + <[federated.0y7zfam0ipwbfv122vvev1ykr655].[sum:Est. Population:qk]> + + + + + + [federated.0y7zfam0ipwbfv122vvev1ykr655].[none:Income Bracket:nk] + [federated.0y7zfam0ipwbfv122vvev1ykr655].[none:Age Group:nk] + + [Sample - EU Superstore].[Profit (bin)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/correlation__connected-scatter__show-how-two-metrics-move-together-over-time.tbm b/plugins/tableau/resources/templates/reference/correlation__connected-scatter__show-how-two-metrics-move-together-over-time.tbm new file mode 100644 index 0000000..9ab339e --- /dev/null +++ b/plugins/tableau/resources/templates/reference/correlation__connected-scatter__show-how-two-metrics-move-together-over-time.tbm @@ -0,0 +1,757 @@ + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>Usually used to show how the relationship between 2 variables has changed over time.</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Year + 20 + [Year] + [Data] + Year + 0 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Bottom 90% + 5 + [Bottom 90%] + [Data] + Bottom 90% + 1 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 10% + 5 + [Top 10%] + [Data] + Top 10% + 2 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 5% + 5 + [Top 5%] + [Data] + Top 5% + 3 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 1% + 5 + [Top 1%] + [Data] + Top 1% + 4 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 0.5% + 5 + [Top 0.5%] + [Data] + Top 0.5% + 5 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 0.1% + 5 + [Top 0.1%] + [Data] + Top 0.1% + 6 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 0.1% with offshore assets + 5 + [Top 0.1% with offshore assets] + [Data] + Top 0.1% with offshore assets + 7 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 0.01% + 5 + [Top 0.01%] + [Data] + Top 0.01% + 8 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 10% to 1% + 5 + [Top 10% to 1%] + [Data] + Top 10% to 1% + 9 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 10% to 5% + 5 + [Top 10% to 5%] + [Data] + Top 10% to 5% + 10 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 5% to 1% + 5 + [Top 5% to 1%] + [Data] + Top 5% to 1% + 11 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 1% to 0.1% + 5 + [Top 1% to 0.1%] + [Data] + Top 1% to 0.1% + 12 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 1% to 0.5% + 5 + [Top 1% to 0.5%] + [Data] + Top 1% to 0.5% + 13 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 0.5% to 0.1% + 5 + [Top 0.5% to 0.1%] + [Data] + Top 0.5% to 0.1% + 14 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Top 0.1% to 0.01% + 5 + [Top 0.1% to 0.01%] + [Data] + Top 0.1% to 0.01% + 15 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + + 0 + [Data] + + Count + true + + 0 + "A1:P101:no:A1:P101:0" + true + 6 + + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Year + 20 + [Year] + [Extract] + Year + 0 + Data + integer + Sum + 100 + true + [Migrated Data] + + + Bottom 90% + 5 + [Bottom 90%] + [Extract] + Bottom 90% + 1 + Data + real + Sum + 97 + true + [Migrated Data] + + + Top 10% + 5 + [Top 10%] + [Extract] + Top 10% + 2 + Data + real + Sum + 97 + true + [Migrated Data] + + + Top 5% + 5 + [Top 5%] + [Extract] + Top 5% + 3 + Data + real + Sum + 97 + true + [Migrated Data] + + + Top 1% + 5 + [Top 1%] + [Extract] + Top 1% + 4 + Data + real + Sum + 100 + true + [Migrated Data] + + + Top 0.5% + 5 + [Top 0.5%] + [Extract] + Top 0.5% + 5 + Data + real + Sum + 100 + true + [Migrated Data] + + + Top 0.1% + 5 + [Top 0.1%] + [Extract] + Top 0.1% + 6 + Data + real + Sum + 100 + true + [Migrated Data] + + + Top 0.1% with offshore assets + 5 + [Top 0.1% with offshore assets] + [Extract] + Top 0.1% with offshore assets + 7 + Data + real + Sum + 100 + true + [Migrated Data] + + + Top 0.01% + 5 + [Top 0.01%] + [Extract] + Top 0.01% + 8 + Data + real + Sum + 100 + true + [Migrated Data] + + + Top 10% to 1% + 5 + [Top 10% to 1%] + [Extract] + Top 10% to 1% + 9 + Data + real + Sum + 97 + true + [Migrated Data] + + + Top 10% to 5% + 5 + [Top 10% to 5%] + [Extract] + Top 10% to 5% + 10 + Data + real + Sum + 95 + true + [Migrated Data] + + + Top 5% to 1% + 5 + [Top 5% to 1%] + [Extract] + Top 5% to 1% + 11 + Data + real + Sum + 97 + true + [Migrated Data] + + + Top 1% to 0.1% + 5 + [Top 1% to 0.1%] + [Extract] + Top 1% to 0.1% + 12 + Data + real + Sum + 100 + true + [Migrated Data] + + + Top 1% to 0.5% + 5 + [Top 1% to 0.5%] + [Extract] + Top 1% to 0.5% + 13 + Data + real + Sum + 98 + true + [Migrated Data] + + + Top 0.5% to 0.1% + 5 + [Top 0.5% to 0.1%] + [Extract] + Top 0.5% to 0.1% + 14 + Data + real + Sum + 100 + true + [Migrated Data] + + + Top 0.1% to 0.01% + 5 + [Top 0.1% to 0.01%] + [Extract] + Top 0.1% to 0.01% + 15 + Data + real + Sum + 100 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0bcq9g80509zc811j5es30x41zxx].[sum:Top 0.01%:qk] + [federated.0bcq9g80509zc811j5es30x41zxx].[sum:Bottom 90%:qk] + + + + + + + [federated.0bcq9g80509zc811j5es30x41zxx].[sum:Bottom 90%:qk] + + + [federated.0bcq9g80509zc811j5es30x41zxx].[sum:Top 0.01%:qk] + + + + [federated.0bcq9g80509zc811j5es30x41zxx].[none:Year:qk] + [federated.0bcq9g80509zc811j5es30x41zxx].[sum:Bottom 90%:qk] + [federated.0bcq9g80509zc811j5es30x41zxx].[sum:Top 0.01%:qk] + + + + 1917 + 0.20487635893130551 + 0.094323836953905435 + + + + +
+
diff --git a/plugins/tableau/resources/templates/reference/correlation__line-plus-column__relate-an-amount-series-to-a-rate-series.tbm b/plugins/tableau/resources/templates/reference/correlation__line-plus-column__relate-an-amount-series-to-a-rate-series.tbm new file mode 100644 index 0000000..1293da5 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/correlation__line-plus-column__relate-an-amount-series-to-a-rate-series.tbm @@ -0,0 +1,1416 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>A good way of showing the relationship between an amount (columns) and a rate (line).</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Migrated Data] + + + Ship Date + 7 + [Ship Date] + [Orders] + Ship Date + 3 + date + Year + true + + "DATE" + + [Migrated Data] + + + Ship Mode + 130 + [Ship Mode] + [Orders] + Ship Mode + 4 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Country + 130 + [Country] + [Orders] + Country + 8 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + City + 130 + [City] + [Orders] + City + 9 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + State + 130 + [State] + [Orders] + State + 10 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Postal Code + 20 + [Postal Code] + [Orders] + Postal Code + 11 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Region + 130 + [Region] + [Orders] + Region + 12 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 13 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Category + 130 + [Category] + [Orders] + Category + 14 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 15 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 16 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Sales + 5 + [Sales] + [Orders] + Sales + 17 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 18 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Discount + 5 + [Discount] + [Orders] + Discount + 19 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Profit + 5 + [Profit] + [Orders] + Profit + 20 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U9995:no:A1:U9995:0" + true + 6 + + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ -1 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Row ID + 20 + [Row ID] + [Extract] + Row ID + 0 + Orders + integer + Sum + 9994 + true + [Migrated Data] + + + Order ID + 129 + [Order ID] + [Extract] + Order ID + 1 + Orders + string + Count + 3397 + true + + [Migrated Data] + + + Order Date + 133 + [Order Date] + [Extract] + Order Date + 2 + Orders + date + Year + 1373 + true + [Migrated Data] + + + Ship Date + 133 + [Ship Date] + [Extract] + Ship Date + 3 + Orders + date + Year + 1492 + true + [Migrated Data] + + + Ship Mode + 129 + [Ship Mode] + [Extract] + Ship Mode + 4 + Orders + string + Count + 4 + true + + [Migrated Data] + + + Customer ID + 129 + [Customer ID] + [Extract] + Customer ID + 5 + Orders + string + Count + 1128 + true + + [Migrated Data] + + + Customer Name + 129 + [Customer Name] + [Extract] + Customer Name + 6 + Orders + string + Count + 1128 + true + + [Migrated Data] + + + Segment + 129 + [Segment] + [Extract] + Segment + 7 + Orders + string + Count + 3 + true + + [Migrated Data] + + + Country + 129 + [Country] + [Extract] + Country + 8 + Orders + string + Count + 1 + true + + [Migrated Data] + + + City + 129 + [City] + [Extract] + City + 9 + Orders + string + Count + 566 + true + + [Migrated Data] + + + State + 129 + [State] + [Extract] + State + 10 + Orders + string + Count + 53 + true + + [Migrated Data] + + + Postal Code + 20 + [Postal Code] + [Extract] + Postal Code + 11 + Orders + integer + Sum + 676 + true + [Migrated Data] + + + Region + 129 + [Region] + [Extract] + Region + 12 + Orders + string + Count + 4 + true + + [Migrated Data] + + + Product ID + 129 + [Product ID] + [Extract] + Product ID + 13 + Orders + string + Count + 2000 + true + + [Migrated Data] + + + Category + 129 + [Category] + [Extract] + Category + 14 + Orders + string + Count + 3 + true + + [Migrated Data] + + + Sub-Category + 129 + [Sub-Category] + [Extract] + Sub-Category + 15 + Orders + string + Count + 17 + true + + [Migrated Data] + + + Product Name + 129 + [Product Name] + [Extract] + Product Name + 16 + Orders + string + Count + 1989 + true + + [Migrated Data] + + + Sales + 5 + [Sales] + [Extract] + Sales + 17 + Orders + real + Sum + 3494 + true + [Migrated Data] + + + Quantity + 20 + [Quantity] + [Extract] + Quantity + 18 + Orders + integer + Sum + 13 + true + [Migrated Data] + + + Discount + 5 + [Discount] + [Extract] + Discount + 19 + Orders + real + Sum + 11 + true + [Migrated Data] + + + Profit + 5 + [Profit] + [Extract] + Profit + 20 + Orders + real + Sum + 4049 + true + [Migrated Data] + + + + + + + + + + + + + + "Actual" + "Estimate" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ([Sample - Superstore].[sum:Sales:qk] + [Sample - Superstore].[sum:Profit:qk]) + [Sample - Superstore].[tqr:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/correlation__radar-profile__compare-multivariate-profiles.tbm b/plugins/tableau/resources/templates/reference/correlation__radar-profile__compare-multivariate-profiles.tbm new file mode 100644 index 0000000..a088358 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/correlation__radar-profile__compare-multivariate-profiles.tbm @@ -0,0 +1,744 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:A104:no:A1:A104:0" + true + 6 + + + + Percentile Rank + 5 + [Percentile Rank] + [Extract] + Percentile Rank + 0 + real + Sum + 19 + true + [Extract (Extract.Extract)_2363FB1A4F434CB184243B518D96DB24] + + + Metric + 129 + [Metric] + [Extract] + Metric + 1 + string + Count + 10 + true + + [Extract (Extract.Extract)_2363FB1A4F434CB184243B518D96DB24] + + + team + 129 + [team] + [Extract] + team + 2 + string + Count + 3 + true + + [Extract (Extract.Extract)_2363FB1A4F434CB184243B518D96DB24] + + + player + 129 + [player] + [Extract] + player + 3 + string + Count + 3 + true + + [Extract (Extract.Extract)_2363FB1A4F434CB184243B518D96DB24] + + + Pad + 20 + [Pad] + [Sheet1] + Pad + 4 + integer + Sum + true + + "I8" + + [Sheet1_DD2C9AE4B947401EB520BA2FEC5C298F] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0ekaykw02fhokp0zlnc6r075pqpt].[none:player:nk] + [federated.0ekaykw02fhokp0zlnc6r075pqpt].[none:Metric:nk] + + + + + + + + + + + + + + + + + + Player: <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[attr:player:nk]> + Æ + <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[none:Metric:nk]> + Percentile Rank: + <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[sum:Percentile Rank:qk]> + + + + + + + + + + + + + + + + + Player: <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[attr:player:nk]> + Æ + <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[none:Metric:nk]> + Percentile Rank: + <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[sum:Percentile Rank:qk]> + + + + + + + + + + + + + + + + + + + + Player: <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[attr:player:nk]> + Æ + <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[none:Metric:nk]> + Percentile Rank: + <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[sum:Percentile Rank:qk]> + + + + + + [federated.0ekaykw02fhokp0zlnc6r075pqpt].[usr:Calculation_674414107009335302:qk:7] + ([federated.0ekaykw02fhokp0zlnc6r075pqpt].[usr:Calculation_674414107009298437:qk:7] + [federated.0ekaykw02fhokp0zlnc6r075pqpt].[usr:Calculation_674414107009298437:qk:7]) +
+
diff --git a/plugins/tableau/resources/templates/reference/correlation__scatter__relate-two-continuous-measures.tbm b/plugins/tableau/resources/templates/reference/correlation__scatter__relate-two-continuous-measures.tbm new file mode 100644 index 0000000..5aff2f2 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/correlation__scatter__relate-two-continuous-measures.tbm @@ -0,0 +1,1383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Birth Rate + 5 + [Birth Rate] + [Extract] + Birth Rate + 0 + World Indicators.csv + real + Sum + 47 + true + [Migrated Data] + + + Business Tax Rate + 5 + [Business Tax Rate] + [Extract] + Business Tax Rate + 1 + World Indicators.csv + real + Sum + 397 + true + [Migrated Data] + + + CO2 Emissions + 20 + [CO2 Emissions] + [Extract] + CO2 Emissions + 2 + World Indicators.csv + integer + Sum + 1261 + true + [Migrated Data] + + + Country/Region + 129 + [Country/Region] + [Extract] + Country/Region + 3 + World Indicators.csv + string + Count + 208 + true + + [Migrated Data] + + + Days to Start Business + 20 + [Days to Start Business] + [Extract] + Days to Start Business + 4 + World Indicators.csv + integer + Sum + 115 + true + [Migrated Data] + + + Ease of Business + 20 + [Ease of Business] + [Extract] + Ease of Business + 5 + World Indicators.csv + integer + Sum + 334 + true + [Migrated Data] + + + Energy Usage + 20 + [Energy Usage] + [Extract] + Energy Usage + 6 + World Indicators.csv + integer + Sum + 1520 + true + [Migrated Data] + + + GDP + 20 + [GDP] + [Extract] + GDP + 7 + World Indicators.csv + integer + Sum + 1605 + true + [Migrated Data] + + + Health Exp % GDP + 5 + [Health Exp % GDP] + [Extract] + Health Exp % GDP + 8 + World Indicators.csv + real + Sum + 131 + true + [Migrated Data] + + + Health Exp/Capita + 20 + [Health Exp/Capita] + [Extract] + Health Exp/Capita + 9 + World Indicators.csv + integer + Sum + 836 + true + [Migrated Data] + + + Hours to do Tax + 20 + [Hours to do Tax] + [Extract] + Hours to do Tax + 10 + World Indicators.csv + integer + Sum + 262 + true + [Migrated Data] + + + Infant Mortality Rate + 5 + [Infant Mortality Rate] + [Extract] + Infant Mortality Rate + 11 + World Indicators.csv + real + Sum + 128 + true + [Migrated Data] + + + Internet Usage + 5 + [Internet Usage] + [Extract] + Internet Usage + 12 + World Indicators.csv + real + Sum + 617 + true + [Migrated Data] + + + Lending Interest + 5 + [Lending Interest] + [Extract] + Lending Interest + 13 + World Indicators.csv + real + Sum + 319 + true + [Migrated Data] + + + Life Expectancy Female + 20 + [Life Expectancy Female] + [Extract] + Life Expectancy Female + 14 + World Indicators.csv + integer + Sum + 48 + true + [Migrated Data] + + + Life Expectancy Male + 20 + [Life Expectancy Male] + [Extract] + Life Expectancy Male + 15 + World Indicators.csv + integer + Sum + 47 + true + [Migrated Data] + + + Mobile Phone Usage + 5 + [Mobile Phone Usage] + [Extract] + Mobile Phone Usage + 16 + World Indicators.csv + real + Sum + 950 + true + [Migrated Data] + + + Population 0-14 + 5 + [Population 0-14] + [Extract] + Population 0-14 + 17 + World Indicators.csv + real + Sum + 391 + true + [Migrated Data] + + + Population 15-64 + 5 + [Population 15-64] + [Extract] + Population 15-64 + 18 + World Indicators.csv + real + Sum + 287 + true + [Migrated Data] + + + Population 65+ + 5 + [Population 65+] + [Extract] + Population 65+ + 19 + World Indicators.csv + real + Sum + 199 + true + [Migrated Data] + + + Population Total + 20 + [Population Total] + [Extract] + Population Total + 20 + World Indicators.csv + integer + Sum + 2691 + true + [Migrated Data] + + + Population Urban + 5 + [Population Urban] + [Extract] + Population Urban + 21 + World Indicators.csv + real + Sum + 782 + true + [Migrated Data] + + + Region + 129 + [Region] + [Extract] + Region + 22 + World Indicators.csv + string + Count + 6 + true + + [Migrated Data] + + + Tourism Inbound + 20 + [Tourism Inbound] + [Extract] + Tourism Inbound + 23 + World Indicators.csv + integer + Sum + 1207 + true + [Migrated Data] + + + Tourism Outbound + 20 + [Tourism Outbound] + [Extract] + Tourism Outbound + 24 + World Indicators.csv + integer + Sum + 1082 + true + [Migrated Data] + + + Year + 133 + [Year] + [Extract] + Year + 25 + World Indicators.csv + date + Year + 13 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Bahrain" + "Iran" + "Iraq" + "Israel" + "Jordan" + "Kuwait" + "Lebanon" + "Oman" + "Qatar" + "Saudi Arabia" + "Syria" + "United Arab Emirates" + "Yemen" + + + + + + + + + [World Indicators].[none:Region:nk] + [World Indicators].[none:Country/Region:nk] + [World Indicators].[sum:CO2 Emissions:qk] + [World Indicators].[sum:GDP:qk] + + + + + + + + + + + + + + + + + + + <[World Indicators].[none:Country/Region:nk]>, <[World Indicators].[yr:Year:ok]> + Æ + CO2 Emissions: + <[World Indicators].[sum:CO2 Emissions:qk]> + Æ + GDP: + <[World Indicators].[sum:GDP:qk]> + + + + + + [World Indicators].[sum:GDP:qk] + [World Indicators].[sum:CO2 Emissions:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/correlation__xy-heatmap__show-patterns-between-two-category-dimensions.tbm b/plugins/tableau/resources/templates/reference/correlation__xy-heatmap__show-patterns-between-two-category-dimensions.tbm new file mode 100644 index 0000000..f8be29d --- /dev/null +++ b/plugins/tableau/resources/templates/reference/correlation__xy-heatmap__show-patterns-between-two-category-dimensions.tbm @@ -0,0 +1,345 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>A good way of showing the patterns between 2 categories of data, less good at showing fine differences in amounts.</run> + </formatted-text> + + + + + #f2e5da + #e6d9ce + #ccc1b7 + #b3a9a0 + #999189 + #807973 + #66605c + #4d4845 + #33302e + #1a1817 + + + + + + + + + + + + + + + + + + + + + Age Group + 130 + [Age Group] + [Sheet1] + Age Group + 0 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Age Range + 130 + [Age Range] + [Sheet1] + Age Range + 1 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Savings Amount + 130 + [Savings Amount] + [Sheet1] + Savings Amount + 2 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Response Rate + 5 + [Response Rate] + [Sheet1] + Response Rate + 3 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:D50:no:A1:D50:0" + true + 2 + + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + Age Group + 129 + [Age Group] + [Extract] + Age Group + 0 + Sheet1 + string + Count + 7 + true + + [Migrated Data] + + + Age Range + 129 + [Age Range] + [Extract] + Age Range + 1 + Sheet1 + string + Count + 7 + true + + [Migrated Data] + + + Savings Amount + 129 + [Savings Amount] + [Extract] + Savings Amount + 2 + Sheet1 + string + Count + 7 + true + + [Migrated Data] + + + Response Rate + 5 + [Response Rate] + [Extract] + Response Rate + 3 + Sheet1 + real + Sum + 45 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "I don't have a savings account" + "$0" + "Just the minimum balance requirement" + "Less than $1,000" + "$1,000-$4,999" + "$5,000-$9,999" + "$10,000 or more" + + + + + + + + + + + + + + + + + + [federated.09c20je0q5g3r21bbot2n14oiosj].[none:Age Range:nk] + [federated.09c20je0q5g3r21bbot2n14oiosj].[none:Savings Amount:nk] +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation-arrow.tbm b/plugins/tableau/resources/templates/reference/deviation-arrow.tbm new file mode 100644 index 0000000..fc6d329 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation-arrow.tbm @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[:Measure Names] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + ([Sample - Superstore].[Multiple Values] + [Sample - Superstore].[sum:Profit:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation-diverging-bar.tbm b/plugins/tableau/resources/templates/reference/deviation-diverging-bar.tbm new file mode 100644 index 0000000..91f3395 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation-diverging-bar.tbm @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[usr:Calculation_1368249927221915648:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation-gain-loss-chart.tbm b/plugins/tableau/resources/templates/reference/deviation-gain-loss-chart.tbm new file mode 100644 index 0000000..4786502 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation-gain-loss-chart.tbm @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - Superstore].[mn:Order Date:ok]> + , + <[Sample - Superstore].[yr:Order Date:ok]> + Æ + Æ + + <[Sample - Superstore].[none:Customer Name:nk]> : + <[Sample - Superstore].[sum:Profit:qk]> + Æ + + Sales : + <[Sample - Superstore].[usr:Calculation_44402728363008000:qk:5]> + Difference : + <[Sample - Superstore].[usr:Calculation_44402728363352065:qk:1]> + <[Sample - Superstore].[usr:Calculation_44402728363454466:qk:1]> + + + + + + [Sample - Superstore].[usr:Calculation_44402728364228614:qk:22] + ([Sample - Superstore].[mn:Order Date:ok] / [Sample - Superstore].[yr:Order Date:ok]) +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation-spine-chart.tbm b/plugins/tableau/resources/templates/reference/deviation-spine-chart.tbm new file mode 100644 index 0000000..692bbca --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation-spine-chart.tbm @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1ko0q9z0cybhx212227b819gayqi].[none:Measure:nk] + [federated.1ko0q9z0cybhx212227b819gayqi].[:Measure Names] + [federated.1ko0q9z0cybhx212227b819gayqi].[none:Calculation_2084392578409873414:nk] + + + + + + + + + + + + + + + + [federated.1ko0q9z0cybhx212227b819gayqi].[none:Customer Name:nk] + [federated.1ko0q9z0cybhx212227b819gayqi].[Multiple Values] +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation__barbell__compare-two-values-per-category.tbm b/plugins/tableau/resources/templates/reference/deviation__barbell__compare-two-values-per-category.tbm new file mode 100644 index 0000000..ecbfe93 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation__barbell__compare-two-values-per-category.tbm @@ -0,0 +1,4329 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Sales: <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Sales: <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Sales: <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + [Sample - EU Superstore].[none:Segment:nk] + ([Sample - EU Superstore].[sum:Sales:qk] + [Sample - EU Superstore].[sum:Sales:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation__bullet__track-actual-vs-target-and-performance-bands.tbm b/plugins/tableau/resources/templates/reference/deviation__bullet__track-actual-vs-target-and-performance-bands.tbm new file mode 100644 index 0000000..af536b9 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation__bullet__track-actual-vs-target-and-performance-bands.tbm @@ -0,0 +1,4291 @@ + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Æ + Total Sales: <[Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk]> + Æ + <[Sample - EU Superstore].[usr:Above/Below (copy)_2476698368372916225:nk]> Target (<[Sample - EU Superstore].[usr:Calculation_1778077472749391873:qk]>) + + + + + + [Sample - EU Superstore].[none:Segment:nk] + [Sample - EU Superstore].[sum:Calculation_1778077472749178880:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation__diverging-bar__show-positive-and-negative-vs-baseline.tbm b/plugins/tableau/resources/templates/reference/deviation__diverging-bar__show-positive-and-negative-vs-baseline.tbm new file mode 100644 index 0000000..f934fff --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation__diverging-bar__show-positive-and-negative-vs-baseline.tbm @@ -0,0 +1,4334 @@ + + + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name></run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Region:nk] + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Country/Region:nk]> + Æ + Profit Ratio: + <[Sample - EU Superstore].[usr:Calculation_1368249927221915648:qk]> + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Country/Region:nk]> + Æ + Profit Ratio: + <[Sample - EU Superstore].[usr:Calculation_1368249927221915648:qk]> + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Country/Region:nk]> + Æ + Profit Ratio: + <[Sample - EU Superstore].[usr:Calculation_1368249927221915648:qk]> + + + + + + [Sample - EU Superstore].[none:Country/Region:nk] + ([Sample - EU Superstore].[usr:Calculation_1368249927221915648:qk] + [Sample - EU Superstore].[usr:Calculation_1368249927221915648:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation__diverging-stacked-bar__show-sentiment-or-likert-breakdown.tbm b/plugins/tableau/resources/templates/reference/deviation__diverging-stacked-bar__show-sentiment-or-likert-breakdown.tbm new file mode 100644 index 0000000..ff4de70 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation__diverging-stacked-bar__show-sentiment-or-likert-breakdown.tbm @@ -0,0 +1,635 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name></run> + </formatted-text> + + + + + + + + + + + + + + QUESTION + 129 + [QUESTION] + [Extract] + QUESTION + 0 + string + Count + 20 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Q + 129 + [Q] + [Extract] + Q + 1 + string + Count + 20 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Answer + 5 + [Answer] + [Extract] + Answer + 2 + real + Sum + 464 + true + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + RespID + 20 + [RespID] + [Extract] + RespID + 3 + integer + Sum + 1714 + true + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Gender + 129 + [Gender] + [Extract] + Gender + 4 + string + Count + 2 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Location + 129 + [Location] + [Extract] + Location + 5 + string + Count + 6 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Generation + 129 + [Generation] + [Extract] + Generation + 6 + string + Count + 4 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Weight + 5 + [Weight] + [Extract] + Weight + 7 + real + Sum + 8 + true + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Question ID + 129 + [Question ID] + [Extract] + Question ID + 8 + string + Count + 20 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Wording + 129 + [Wording] + [Extract] + Wording + 9 + string + Count + 20 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Question Grouping + 129 + [Question Grouping] + [Extract] + Question Grouping + 10 + string + Count + 4 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Question Type + 129 + [Question Type] + [Extract] + Question Type + 11 + string + Count + 4 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Question Type:nk] + [federated.0sqeay81nbhomo1gxl1y71cdj990].[:Measure Names] + [federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Answer:qk] + [federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Wording:nk] + + + + + + + + + + + + + + + + + + + <[federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Wording:nk]> + Answer - + <[federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Answer:ok]> + Æ + Percentage of Respondents: + <[federated.0sqeay81nbhomo1gxl1y71cdj990].[usr:Calculation_1840846392186605596:qk:6]> + + + + + + [federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Wording:nk] + [federated.0sqeay81nbhomo1gxl1y71cdj990].[usr:Calculation_1840846392187043871:qk:26] +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation__spine__split-one-measure-into-two-opposing-parts.tbm b/plugins/tableau/resources/templates/reference/deviation__spine__split-one-measure-into-two-opposing-parts.tbm new file mode 100644 index 0000000..16ab795 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation__spine__split-one-measure-into-two-opposing-parts.tbm @@ -0,0 +1,761 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name></run> + </formatted-text> + + + + + + + + + + + + + + Q3_9 - Makes good coffee + 129 + [Q3_9 - Makes good coffee] + [Extract] + Q3_9 - Makes good coffee + 0 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q2_4 - Temperature + 129 + [Q2_4 - Temperature] + [Extract] + Q2_4 - Temperature + 1 + string + Count + 3 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q2_5 - Galvanic Skin Response + 20 + [Q2_5 - Galvanic Skin Response] + [Extract] + Q2_5 - Galvanic Skin Response + 2 + integer + Sum + 2 + true + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q2_6 - Breathing + 129 + [Q2_6 - Breathing] + [Extract] + Q2_6 - Breathing + 3 + string + Count + 3 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q2_7 - Perspiration + 129 + [Q2_7 - Perspiration] + [Extract] + Q2_7 - Perspiration + 4 + string + Count + 3 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q2_9 - Adrenaline Production + 129 + [Q2_9 - Adrenaline Production] + [Extract] + Q2_9 - Adrenaline Production + 5 + string + Count + 3 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q3_4 - Can Play Jazz + 129 + [Q3_4 - Can Play Jazz] + [Extract] + Q3_4 - Can Play Jazz + 6 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q2_3 - Blood Pressure + 129 + [Q2_3 - Blood Pressure] + [Extract] + Q2_3 - Blood Pressure + 7 + string + Count + 3 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q3_5 - Likes the Beatles + 129 + [Q3_5 - Likes the Beatles] + [Extract] + Q3_5 - Likes the Beatles + 8 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q3_8 - Is Kind to animals + 129 + [Q3_8 - Is Kind to animals] + [Extract] + Q3_8 - Is Kind to animals + 9 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q100 - Salary + 129 + [Q100 - Salary] + [Extract] + Q100 - Salary + 10 + string + Count + 845 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q2_8 - Pupil Dilation + 129 + [Q2_8 - Pupil Dilation] + [Extract] + Q2_8 - Pupil Dilation + 11 + string + Count + 3 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q2_1 - Pulse Rate + 129 + [Q2_1 - Pulse Rate] + [Extract] + Q2_1 - Pulse Rate + 12 + string + Count + 3 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q1 - Vote in the upcoming election? + 129 + [Q1 - Vote in the upcoming election?] + [Extract] + Q1 - Vote in the upcoming election? + 13 + string + Count + 4 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q3_2 - Good Sense of Humor + 129 + [Q3_2 - Good Sense of Humor] + [Extract] + Q3_2 - Good Sense of Humor + 14 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q2_2 - Metabolism + 129 + [Q2_2 - Metabolism] + [Extract] + Q2_2 - Metabolism + 15 + string + Count + 3 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q3_1 - Good Job Skills + 129 + [Q3_1 - Good Job Skills] + [Extract] + Q3_1 - Good Job Skills + 16 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q3_3 - High Intelligence + 129 + [Q3_3 - High Intelligence] + [Extract] + Q3_3 - High Intelligence + 17 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q3_6 - Good Ability to lift heavy objects + 129 + [Q3_6 - Good Ability to lift heavy objects] + [Extract] + Q3_6 - Good Ability to lift heavy objects + 18 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Q3_7 - Has grace under pressure + 129 + [Q3_7 - Has grace under pressure] + [Extract] + Q3_7 - Has grace under pressure + 19 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + RespID + 20 + [RespID] + [Extract] + RespID + 20 + integer + Sum + 845 + true + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Gender + 129 + [Gender] + [Extract] + Gender + 21 + string + Count + 2 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Location + 129 + [Location] + [Extract] + Location + 22 + string + Count + 6 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + Generation + 129 + [Generation] + [Extract] + Generation + 23 + string + Count + 4 + true + + [Extract (Extract.Extract)_CE52D121DCD24D379952E412A7CF9CB8] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0w7d7y516eho731d703ht1yw6d0w].[none:Location:nk] + [federated.0w7d7y516eho731d703ht1yw6d0w].[none:Q2_1 - Pulse Rate:nk] + + + + + + + + + + + + + + + + + <[federated.04cqzfd1c87p031d9r1d113h78i6].[usr:F - responses (copy)_937593187657646082:qk]> + of Total Respondents in + <[federated.04cqzfd1c87p031d9r1d113h78i6].[none:Location:nk]> + responded + NO + to Q1. + + + + + + + + + + + + + + + + <[federated.0w7d7y516eho731d703ht1yw6d0w].[usr:Q1 - Yes (copy)_937593187665588230:qk]> + of Total Respondents in <[federated.0w7d7y516eho731d703ht1yw6d0w].[none:Location:nk]> responded + NO + to Q1. + + + + + + + + + + + + + + + + <[federated.0w7d7y516eho731d703ht1yw6d0w].[usr:Calculation_937593187665391621:qk]> + of Total Respondents in <[federated.0w7d7y516eho731d703ht1yw6d0w].[none:Location:nk]> responded + YES + to Q1. + + + + + + [federated.0w7d7y516eho731d703ht1yw6d0w].[none:Location:nk] + ([federated.0w7d7y516eho731d703ht1yw6d0w].[usr:Q1 - Yes (copy)_937593187665588230:qk] + [federated.0w7d7y516eho731d703ht1yw6d0w].[usr:Calculation_937593187665391621:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/deviation__surplus-deficit-area__show-above-below-baseline-over-time.tbm b/plugins/tableau/resources/templates/reference/deviation__surplus-deficit-area__show-above-below-baseline-over-time.tbm new file mode 100644 index 0000000..66eef68 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/deviation__surplus-deficit-area__show-above-below-baseline-over-time.tbm @@ -0,0 +1,4303 @@ + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name></run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ -1 +
+
+
+ +
+ + + + + [Sample - EU Superstore].[none:Sub-Category:nk] + + +
+ + + + + + + + + + + <[Sample - EU Superstore].[tqr:Order Date:qk]> + Æ + % Surplus: + <[Sample - EU Superstore].[pcdf:sum:Profit:qk]> + + + + + + + + + + + + + <[Sample - EU Superstore].[tqr:Order Date:qk]> + Æ + % Surplus: + <[Sample - EU Superstore].[pcdf:sum:Profit:qk]> + + + + + + + + + + + + + <[Sample - EU Superstore].[tqr:Order Date:qk]> + Æ + % Deficit: + <[Sample - EU Superstore].[pcdf:sum:Profit:qk]> + + + + + + ([Sample - EU Superstore].[pcdf:sum:Profit:qk] + [Sample - EU Superstore].[pcdf:sum:Profit:qk]) + [Sample - EU Superstore].[tqr:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/distribution-histogram.tbm b/plugins/tableau/resources/templates/reference/distribution-histogram.tbm new file mode 100644 index 0000000..ac29c47 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/distribution-histogram.tbm @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Actual" + "Estimate" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Customer Name:nk]> (<[Sample - EU Superstore].[none:Segment:nk]>) + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + [Sample - EU Superstore].[none:Segment:nk] + [Sample - EU Superstore].[sum:Sales:qk] + + [Sample - EU Superstore].[Sales (bin)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/distribution__beeswarm__show-each-point-without-overlap-hiding-density.tbm b/plugins/tableau/resources/templates/reference/distribution__beeswarm__show-each-point-without-overlap-hiding-density.tbm new file mode 100644 index 0000000..21a9216 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/distribution__beeswarm__show-each-point-without-overlap-hiding-density.tbm @@ -0,0 +1,673 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Violin data] + + Count + true + + 0 + "A1:E1092:no:A1:E1092:0" + true + 6 + + + + + 0 + [Scaffold] + + Count + true + + 0 + "A1:A100:no:A1:A100:0" + true + 6 + + + + ID + 20 + [ID] + [Violin data] + ID + 0 + integer + Sum + true + + "I8" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + host_id + 20 + [host_id] + [Violin data] + host_id + 1 + integer + Sum + true + + "I8" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + borough + 130 + [borough] + [Violin data] + borough + 2 + string + Count + true + + + "WSTR" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + neighbourhood + 130 + [neighbourhood] + [Violin data] + neighbourhood + 3 + string + Count + true + + + "WSTR" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + price + 20 + [price] + [Violin data] + price + 4 + integer + Sum + true + + "I8" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + Saffold Value + 20 + [Saffold Value] + [Scaffold] + Saffold Value + 5 + integer + Sum + true + + "I8" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1hii5tt0bk6jak18l15yz06f3din].[none:neighbourhood:nk] + + + + + + + + + + + + + + + + + + + <[federated.1hii5tt0bk6jak18l15yz06f3din].[attr:neighbourhood:nk]> + Æ + BnB Price: <[federated.1hii5tt0bk6jak18l15yz06f3din].[sum:price:qk]> + + + + + + [federated.1hii5tt0bk6jak18l15yz06f3din].[usr:Calculation_917889942041874457:qk:4] + [federated.1hii5tt0bk6jak18l15yz06f3din].[none:Calculation_917889942041595926:qk] + + [World Indicators].[GDP (bin)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/distribution__boxplot__summarize-median-spread-and-outliers-by-category.tbm b/plugins/tableau/resources/templates/reference/distribution__boxplot__summarize-median-spread-and-outliers-by-category.tbm new file mode 100644 index 0000000..c6371fd --- /dev/null +++ b/plugins/tableau/resources/templates/reference/distribution__boxplot__summarize-median-spread-and-outliers-by-category.tbm @@ -0,0 +1,4252 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Customer Name:nk]> (<[Sample - EU Superstore].[none:Segment:nk]>) + Æ + Total Profit: + <[Sample - EU Superstore].[sum:Profit:qk]> + + + + + + [Sample - EU Superstore].[sum:Profit:qk] + [Sample - EU Superstore].[none:Segment:nk] + + [Sample - EU Superstore].[Sales (bin)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/distribution__cumulative-curve__show-inequality-or-cumulative-share.tbm b/plugins/tableau/resources/templates/reference/distribution__cumulative-curve__show-inequality-or-cumulative-share.tbm new file mode 100644 index 0000000..78285eb --- /dev/null +++ b/plugins/tableau/resources/templates/reference/distribution__cumulative-curve__show-inequality-or-cumulative-share.tbm @@ -0,0 +1,4353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + <[Sample - EU Superstore].[none:Calculation_1840846392155148294:qk]> + week(s) since 1st order + Æ + Culmulative Sales: + <[Sample - EU Superstore].[cum:sum:Sales:qk]> + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + <[Sample - EU Superstore].[none:Calculation_1840846392155148294:qk]> + week(s) since 1st order + Æ + Culmulative Sales: + <[Sample - EU Superstore].[cum:sum:Sales:qk]> + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + <[Sample - EU Superstore].[none:Calculation_1840846392155148294:qk]> + week(s) since 1st order + Æ + Culmulative Sales: + <[Sample - EU Superstore].[usr:Calculation_1840846392150978561:qk]> + + + + + + ([Sample - EU Superstore].[cum:sum:Sales:qk] + [Sample - EU Superstore].[usr:Calculation_1840846392150978561:qk]) + [Sample - EU Superstore].[none:Calculation_1840846392155148294:qk] + + [Sample - EU Superstore].[Sales per Order (bin)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/distribution__dot-plot__show-min-max-or-range-across-categories.tbm b/plugins/tableau/resources/templates/reference/distribution__dot-plot__show-min-max-or-range-across-categories.tbm new file mode 100644 index 0000000..35744cd --- /dev/null +++ b/plugins/tableau/resources/templates/reference/distribution__dot-plot__show-min-max-or-range-across-categories.tbm @@ -0,0 +1,4270 @@ + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + [Sample - EU Superstore].[none:Segment:nk] + [Sample - EU Superstore].[none:Region:nk] + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[usr:Calculation_917889941776945159:qk:3] + [Sample - EU Superstore].[none:Calculation_917889941776822277:qk] + + [Sample - EU Superstore].[Sales (bin)] + + +
+
diff --git a/plugins/tableau/resources/templates/reference/distribution__histogram__show-shape-and-frequency-of-a-measure.tbm b/plugins/tableau/resources/templates/reference/distribution__histogram__show-shape-and-frequency-of-a-measure.tbm new file mode 100644 index 0000000..3b97049 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/distribution__histogram__show-shape-and-frequency-of-a-measure.tbm @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [AGE data.csv] + + Count + true + + "UTF-8" + "en_GB" + "£" + "," + "true" + "en_GB" + "" + + + + Age + 20 + [Age] + [AGE data.csv] + Age + 0 + integer + Sum + true + [AGE data.csv_83DDB57C1E42458C86FBA2A0B16D8F07] + + + Total + 20 + [Total] + [AGE data.csv] + Total + 1 + integer + Sum + true + [AGE data.csv_83DDB57C1E42458C86FBA2A0B16D8F07] + + + Pivot Field Names + 129 + [Pivot Field Names] + [Pivot] + Pivot Field Names + 2 + string + Count + true + [AGE data.csv_83DDB57C1E42458C86FBA2A0B16D8F07] + + + Pivot Field Values + 20 + [Pivot Field Values] + [Pivot] + Pivot Field Values + 3 + integer + Sum + true + [AGE data.csv_83DDB57C1E42458C86FBA2A0B16D8F07] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[federated.11xs2hw1547p7c12z6rii15tk9xk].[none:Age (bin):ok]> Age Bin + Æ + Total Population: + <[federated.11xs2hw1547p7c12z6rii15tk9xk].[sum:Pivot Field Values:qk]> + + + + + + [federated.11xs2hw1547p7c12z6rii15tk9xk].[sum:Pivot Field Values:qk] + [federated.11xs2hw1547p7c12z6rii15tk9xk].[none:Age (bin):ok] + + [Sample - EU Superstore].[Sales (bin)] + [federated.11xs2hw1547p7c12z6rii15tk9xk].[Age (bin)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/distribution__population-pyramid__compare-mirrored-group-distributions.tbm b/plugins/tableau/resources/templates/reference/distribution__population-pyramid__compare-mirrored-group-distributions.tbm new file mode 100644 index 0000000..db14eab --- /dev/null +++ b/plugins/tableau/resources/templates/reference/distribution__population-pyramid__compare-mirrored-group-distributions.tbm @@ -0,0 +1,394 @@ + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [AGE data.csv] + + Count + true + + "UTF-8" + "en_GB" + "£" + "," + "true" + "en_GB" + "" + + + + Age + 20 + [Age] + [AGE data.csv] + Age + 0 + integer + Sum + true + [AGE data.csv_83DDB57C1E42458C86FBA2A0B16D8F07] + + + Total + 20 + [Total] + [AGE data.csv] + Total + 1 + integer + Sum + true + [AGE data.csv_83DDB57C1E42458C86FBA2A0B16D8F07] + + + Pivot Field Names + 129 + [Pivot Field Names] + [Pivot] + Pivot Field Names + 2 + string + Count + true + [AGE data.csv_83DDB57C1E42458C86FBA2A0B16D8F07] + + + Pivot Field Values + 20 + [Pivot Field Values] + [Pivot] + Pivot Field Values + 3 + integer + Sum + true + [AGE data.csv_83DDB57C1E42458C86FBA2A0B16D8F07] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[federated.11xs2hw1547p7c12z6rii15tk9xk].[none:Age (bin):ok]> Age Bin + Æ + Total Population: + <[federated.11xs2hw1547p7c12z6rii15tk9xk].[sum:Pivot Field Values:qk]> + + + + + + [federated.11xs2hw1547p7c12z6rii15tk9xk].[none:Age:qk] + [federated.11xs2hw1547p7c12z6rii15tk9xk].[sum:M (copy)_95983007992475649:qk] + + [Sample - EU Superstore].[Sales (bin)] + [federated.11xs2hw1547p7c12z6rii15tk9xk].[Age (bin)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/distribution__violin__show-full-density-shape-beyond-simple-summary.tbm b/plugins/tableau/resources/templates/reference/distribution__violin__show-full-density-shape-beyond-simple-summary.tbm new file mode 100644 index 0000000..f3683d6 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/distribution__violin__show-full-density-shape-beyond-simple-summary.tbm @@ -0,0 +1,657 @@ + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Violin data] + + Count + true + + 0 + "A1:E1092:no:A1:E1092:0" + true + 6 + + + + + 0 + [Scaffold] + + Count + true + + 0 + "A1:A100:no:A1:A100:0" + true + 6 + + + + ID + 20 + [ID] + [Violin data] + ID + 0 + integer + Sum + true + + "I8" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + host_id + 20 + [host_id] + [Violin data] + host_id + 1 + integer + Sum + true + + "I8" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + borough + 130 + [borough] + [Violin data] + borough + 2 + string + Count + true + + + "WSTR" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + neighbourhood + 130 + [neighbourhood] + [Violin data] + neighbourhood + 3 + string + Count + true + + + "WSTR" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + price + 20 + [price] + [Violin data] + price + 4 + integer + Sum + true + + "I8" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + Saffold Value + 20 + [Saffold Value] + [Scaffold] + Saffold Value + 5 + integer + Sum + true + + "I8" + + [Violin data_26205CBC9F384839A6A3D507A2A04A9F] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <!Missing Field!> + Age Bin + Æ + Total Population: + <!Missing Field!> + + + + + + + + + + + + + <!Missing Field!> + Age Bin + Æ + Total Population: + <!Missing Field!> + + + + + + + + + + + + + <!Missing Field!> + Age Bin + Æ + Total Population: + <!Missing Field!> + + + + + + [federated.1hii5tt0bk6jak18l15yz06f3din].[none:Calculation_1915437258869919759:qk] + ([federated.1hii5tt0bk6jak18l15yz06f3din].[sum:Calculation_1915437258870394896:qk] + [federated.1hii5tt0bk6jak18l15yz06f3din].[usr:Calculation_917889941767651328:qk]) + + [Sample - EU Superstore].[Sales (bin)] + [federated.11xs2hw1547p7c12z6rii15tk9xk].[Age (bin)] + + +
+
diff --git a/plugins/tableau/resources/templates/reference/flow__chord__show-two-way-flows-in-a-matrix.tbm b/plugins/tableau/resources/templates/reference/flow__chord__show-two-way-flows-in-a-matrix.tbm new file mode 100644 index 0000000..daded7c --- /dev/null +++ b/plugins/tableau/resources/templates/reference/flow__chord__show-two-way-flows-in-a-matrix.tbm @@ -0,0 +1,526 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Rank + 20 + [Rank] + [Extract] + Rank + 0 + integer + Sum + 27 + true + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + Rank2 + 20 + [Rank2] + [Extract] + Rank2 + 1 + integer + Sum + 19 + true + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + t + 5 + [t] + [Extract] + t + 2 + real + Sum + 102 + true + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + Dimension + 129 + [Dimension] + [Extract] + Dimension + 3 + string + Count + 27 + true + + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + To Dimension + 129 + [To Dimension] + [Extract] + To Dimension + 4 + string + Count + 19 + true + + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + Measure + 20 + [Measure] + [Extract] + Measure + 5 + integer + Sum + 56 + true + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rank + 20 + [Rank] + [Extract] + Rank + 0 + Extract + integer + Sum + 27 + true + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + Rank2 + 20 + [Rank2] + [Extract] + Rank2 + 1 + Extract + integer + Sum + 19 + true + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + t + 5 + [t] + [Extract] + t + 2 + Extract + real + Sum + 102 + true + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + Dimension + 129 + [Dimension] + [Extract] + Dimension + 3 + Extract + string + Count + 27 + true + + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + To Dimension + 129 + [To Dimension] + [Extract] + To Dimension + 4 + Extract + string + Count + 19 + true + + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + Measure + 20 + [Measure] + [Extract] + Measure + 5 + Extract + integer + Sum + 56 + true + [Extract (Extract.Extract)_8EF84C23CCE74F9D9D46F70554FF6C86] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0ubafqv1bygk7b19u3voc1nh25s4].[none:Calculation_1440926096150550:nk] + [federated.0ubafqv1bygk7b19u3voc1nh25s4].[none:Calculation_1440926096482328:nk] + [federated.0ubafqv1bygk7b19u3voc1nh25s4].[none:Calculation_1440926121443372:nk] + [federated.0ubafqv1bygk7b19u3voc1nh25s4].[none:Dimension:nk] + [federated.0ubafqv1bygk7b19u3voc1nh25s4].[none:To Dimension:nk] + [federated.0ubafqv1bygk7b19u3voc1nh25s4].[none:t:qk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[federated.0ubafqv1bygk7b19u3voc1nh25s4].[none:Dimension:nk]> + migration to + <[federated.0ubafqv1bygk7b19u3voc1nh25s4].[attr:To Dimension:nk]> + Æ + <[federated.0ubafqv1bygk7b19u3voc1nh25s4].[sum:Measure:qk]> + + + + + + [federated.0ubafqv1bygk7b19u3voc1nh25s4].[none:Calculation_1440926098173992:qk] + [federated.0ubafqv1bygk7b19u3voc1nh25s4].[none:Calculation_1440926098092071:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/flow__network__show-relationship-strength-among-nodes.tbm b/plugins/tableau/resources/templates/reference/flow__network__show-relationship-strength-among-nodes.tbm new file mode 100644 index 0000000..723dc19 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/flow__network__show-relationship-strength-among-nodes.tbm @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [tableau_network_ready.csv] + + Count + true + + "UTF-8" + "en_GB" + "£" + "," + "true" + "en_GB" + "" + + + + Edge_ID + 20 + [Edge_ID] + [tableau_network_ready.csv] + Edge_ID + 0 + integer + Sum + true + [tableau_network_ready.csv_6CCDDEA8DD52418CBD9946CD1D7FCA89] + + + Movie + 129 + [Movie] + [tableau_network_ready.csv] + Movie + 1 + string + Count + 1 + 1073741823 + true + + [tableau_network_ready.csv_6CCDDEA8DD52418CBD9946CD1D7FCA89] + + + Actor_Label + 129 + [Actor_Label] + [tableau_network_ready.csv] + Actor_Label + 2 + string + Count + 1 + 1073741823 + true + + [tableau_network_ready.csv_6CCDDEA8DD52418CBD9946CD1D7FCA89] + + + Node_ID + 20 + [Node_ID] + [tableau_network_ready.csv] + Node_ID + 3 + integer + Sum + true + [tableau_network_ready.csv_6CCDDEA8DD52418CBD9946CD1D7FCA89] + + + Total_Screen_Time + 5 + [Total_Screen_Time] + [tableau_network_ready.csv] + Total_Screen_Time + 4 + real + Sum + true + [tableau_network_ready.csv_6CCDDEA8DD52418CBD9946CD1D7FCA89] + + + X + 5 + [X] + [tableau_network_ready.csv] + X + 5 + real + Sum + true + [tableau_network_ready.csv_6CCDDEA8DD52418CBD9946CD1D7FCA89] + + + Y + 5 + [Y] + [tableau_network_ready.csv] + Y + 6 + real + Sum + true + [tableau_network_ready.csv_6CCDDEA8DD52418CBD9946CD1D7FCA89] + + + Path_Order + 20 + [Path_Order] + [tableau_network_ready.csv] + Path_Order + 7 + integer + Sum + true + [tableau_network_ready.csv_6CCDDEA8DD52418CBD9946CD1D7FCA89] + + + Role + 129 + [Role] + [tableau_network_ready.csv] + Role + 8 + string + Count + 1 + 1073741823 + true + + [tableau_network_ready.csv_6CCDDEA8DD52418CBD9946CD1D7FCA89] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.139040n14xky88165h8nr1nfz546].[ctd:Movie:ok] + [federated.139040n14xky88165h8nr1nfz546].[none:Actor_Label:nk] + [federated.139040n14xky88165h8nr1nfz546].[none:Edge_ID:ok] + [federated.139040n14xky88165h8nr1nfz546].[none:Movie:nk] + [federated.139040n14xky88165h8nr1nfz546].[none:Node_ID:ok] + [federated.139040n14xky88165h8nr1nfz546].[none:Role:nk] + [federated.139040n14xky88165h8nr1nfz546].[none:Y:qk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.139040n14xky88165h8nr1nfz546].[none:Movie:nk] + [federated.139040n14xky88165h8nr1nfz546].[none:Actor_Label:nk] + + + + + + + + + + + + + + + + + <[federated.139040n14xky88165h8nr1nfz546].[attr:Actor_Label:nk]> + Æ + <[federated.139040n14xky88165h8nr1nfz546].[ctd:Movie:ok]>/3 + Movies + Æ + <[federated.139040n14xky88165h8nr1nfz546].[sum:Total_Screen_Time:qk]> Seconds + Total Screen Time + Æ + <[federated.139040n14xky88165h8nr1nfz546].[none:Edge_ID:ok]> + + + + + + + + + + + + + + + + + + <[federated.139040n14xky88165h8nr1nfz546].[attr:Actor_Label:nk]> + Æ + <[federated.139040n14xky88165h8nr1nfz546].[ctd:Movie:ok]>/3 + Movies + Æ + <[federated.139040n14xky88165h8nr1nfz546].[sum:Total_Screen_Time:qk]> Seconds + Total Screen Time + Æ + <[federated.139040n14xky88165h8nr1nfz546].[none:Edge_ID:ok]> + + + + + + + + + + + + + + + + + + + + + + ([federated.139040n14xky88165h8nr1nfz546].[none:Y:qk] + [federated.139040n14xky88165h8nr1nfz546].[none:Y:qk]) + [federated.139040n14xky88165h8nr1nfz546].[none:X:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/flow__sankey__trace-volume-through-multi-stage-paths.tbm b/plugins/tableau/resources/templates/reference/flow__sankey__trace-volume-through-multi-stage-paths.tbm new file mode 100644 index 0000000..0f5c19c --- /dev/null +++ b/plugins/tableau/resources/templates/reference/flow__sankey__trace-volume-through-multi-stage-paths.tbm @@ -0,0 +1,4320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Category:nk]> + Æ + + <[Sample - EU Superstore].[none:Region:nk]> + Æ + + + + + + [Sample - EU Superstore].[usr:Calculation_1316740006742511626:qk:40] + [Sample - EU Superstore].[usr:Calculation_2063211644610392067:qk:2] + + [Sample - EU Superstore].[Path Frame (bin)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/flow__waterfall__sequence-budget-or-process-steps-with-plus-minus.tbm b/plugins/tableau/resources/templates/reference/flow__waterfall__sequence-budget-or-process-steps-with-plus-minus.tbm new file mode 100644 index 0000000..0523451 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/flow__waterfall__sequence-budget-or-process-steps-with-plus-minus.tbm @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>Designed to show the sequencing of data through a flow process, typically budgets. Can include +/- components.</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + Item + 130 + [Item] + [Financial] + Item + 0 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Date + 7 + [Date] + [Financial] + Date + 1 + date + Year + true + + "DATE" + + [Migrated Data] + + + Amount + 20 + [Amount] + [Financial] + Amount + 2 + integer + Sum + true + + "I8" + + [Migrated Data] + + + + 0 + [Financial] + + Count + true + + 0 + "A1:C29:no:A1:C29:0" + true + 6 + + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + Item + 129 + [Item] + [Extract] + Item + 0 + Financial + string + Count + 7 + true + + [Migrated Data] + + + Date + 133 + [Date] + [Extract] + Date + 1 + Financial + date + Year + 1 + true + [Migrated Data] + + + Amount + 20 + [Amount] + [Extract] + Amount + 2 + Financial + integer + Sum + 7 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1q3xxhn1t1nxoz17152l71ng6tqf].[md:Pivot Field Names:ok] + [federated.1q3xxhn1t1nxoz17152l71ng6tqf].[none:Category:nk] + [federated.1q3xxhn1t1nxoz17152l71ng6tqf].[none:Order:ok] + [federated.1q3xxhn1t1nxoz17152l71ng6tqf].[sum:Amount:qk] + [federated.1q3xxhn1t1nxoz17152l71ng6tqf].[yr:Pivot Field Names:ok] + [federated.1s4iy760mr8q5k1bhiupl0u002ul].[none:Item:nk] + [federated.1s4iy760mr8q5k1bhiupl0u002ul].[usr:Calculation_5073656843881439273:nk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Total Revenue" + "Cost of Revenue" + "Add'l income items" + "Income Tax" + "Research and Development" + "Sales, General and Admin." + "Add'l expense items" + %all% + + + + + + + + + + + + + + + + + + [federated.1s4iy760mr8q5k1bhiupl0u002ul].[cum:sum:Amount:qk] + [federated.1s4iy760mr8q5k1bhiupl0u002ul].[none:Item:nk] +
+
diff --git a/plugins/tableau/resources/templates/reference/gantt-chart.tbm b/plugins/tableau/resources/templates/reference/gantt-chart.tbm new file mode 100644 index 0000000..d8d50be --- /dev/null +++ b/plugins/tableau/resources/templates/reference/gantt-chart.tbm @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[yr:Order Date:ok] + [Sample - Superstore].[none:Product Name:nk] + [Sample - Superstore].[none:Profit (bin):nk] + + + + + + + + + + + + + + + + + + ([Sample - Superstore].[none:Customer Name:nk] / ([Sample - Superstore].[none:Product Name:nk] / ([Sample - Superstore].[none:Profit (bin):nk] / [Sample - Superstore].[none:Region:nk]))) + ([Sample - Superstore].[yr:Order Date:ok] / [Sample - Superstore].[mn:Order Date:ok]) +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__bubble-pack__compare-part-sizes-without-axes.tbm b/plugins/tableau/resources/templates/reference/magnitude__bubble-pack__compare-part-sizes-without-axes.tbm new file mode 100644 index 0000000..f1935eb --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__bubble-pack__compare-part-sizes-without-axes.tbm @@ -0,0 +1,4260 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Region:nk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Region:nk]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + <[Sample - EU Superstore].[none:Region:nk]> + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + + +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__column__compare-sizes-from-zero.tbm b/plugins/tableau/resources/templates/reference/magnitude__column__compare-sizes-from-zero.tbm new file mode 100644 index 0000000..afd53e6 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__column__compare-sizes-from-zero.tbm @@ -0,0 +1,4298 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Delivery Mode:nk] + + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + ([Sample - EU Superstore].[ctd:Order ID:qk] + [Sample - EU Superstore].[ctd:Order ID:qk]) + [Sample - EU Superstore].[none:Delivery Mode:nk] +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__horizontal-bar__compare-discrete-categories-from-zero.tbm b/plugins/tableau/resources/templates/reference/magnitude__horizontal-bar__compare-discrete-categories-from-zero.tbm new file mode 100644 index 0000000..72d047c --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__horizontal-bar__compare-discrete-categories-from-zero.tbm @@ -0,0 +1,4301 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (horizontal)</run> + <run>Æ </run> + <run fontcolor='#6e7383' fontname='Tableau Regular' fontsize='10'>Best for comparing discrete categories with a shared baseline (zero). Good when categories don't follow a natural order (e.g. income brackets or time series), and makes reading headers easier than vertical bars. </run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Delivery Mode:nk] + + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + [Sample - EU Superstore].[none:Delivery Mode:nk] + ([Sample - EU Superstore].[ctd:Order ID:qk] + [Sample - EU Superstore].[ctd:Order ID:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__lollipop__emphasize-values-over-bar-ink.tbm b/plugins/tableau/resources/templates/reference/magnitude__lollipop__emphasize-values-over-bar-ink.tbm new file mode 100644 index 0000000..3a88eb5 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__lollipop__emphasize-values-over-bar-ink.tbm @@ -0,0 +1,4291 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + [Sample - EU Superstore].[none:Delivery Mode:nk] + ([Sample - EU Superstore].[ctd:Order ID:qk] + [Sample - EU Superstore].[ctd:Order ID:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__paired-bar__compare-two-series-across-categories.tbm b/plugins/tableau/resources/templates/reference/magnitude__paired-bar__compare-two-series-across-categories.tbm new file mode 100644 index 0000000..82f0c29 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__paired-bar__compare-two-series-across-categories.tbm @@ -0,0 +1,4281 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (horizontal)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + [Sample - EU Superstore].[none:Delivery Mode:nk] + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + ([Sample - EU Superstore].[none:Delivery Mode:nk] / [Sample - EU Superstore].[yr:Order Date:ok]) + [Sample - EU Superstore].[ctd:Order ID:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__paired-column__compare-two-series-across-categories.tbm b/plugins/tableau/resources/templates/reference/magnitude__paired-column__compare-two-series-across-categories.tbm new file mode 100644 index 0000000..bd175b2 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__paired-column__compare-two-series-across-categories.tbm @@ -0,0 +1,4279 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + [Sample - EU Superstore].[none:Delivery Mode:nk] + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + [Sample - EU Superstore].[ctd:Order ID:qk] + ([Sample - EU Superstore].[none:Delivery Mode:nk] / [Sample - EU Superstore].[yr:Order Date:ok]) +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__parallel-coordinates__compare-entities-across-many-variables.tbm b/plugins/tableau/resources/templates/reference/magnitude__parallel-coordinates__compare-entities-across-many-variables.tbm new file mode 100644 index 0000000..c4312a1 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__parallel-coordinates__compare-entities-across-many-variables.tbm @@ -0,0 +1,1177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Metric + 129 + [Metric] + [Extract] + Metric + 0 + string + Count + 6 + true + + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + Value + 5 + [Value] + [Extract] + Value + 1 + real + Sum + 47 + true + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + Country/Region + 129 + [Country/Region] + [Extract] + Country/Region + 2 + string + Count + 48 + true + + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + Region + 129 + [Region] + [Extract] + Region + 3 + string + Count + 1 + true + + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + Year + 133 + [Year] + [Extract] + Year + 4 + date + Year + 1 + true + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Birth Rate Percentile Rank" + "Energy Usage Percentile RANK" + "GDP Percentile Rank" + "Health Exp Percentile Rank" + "Infant Mortality Percentile Rank" + + + + [federated.0luwvdb15h38a719e117k10zo3f4].[none:Metric:nk] + [federated.0luwvdb15h38a719e117k10zo3f4].[none:Country/Region:nk] + + + + + + + + + + + + + + + + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Country/Region:nk]> + Æ + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Metric:nk]> Percentile Rank: + <[federated.0luwvdb15h38a719e117k10zo3f4].[usr:Calculation_3198400214763864065:qk]> Percentile + + + + + + + + + + + + + + + + + + + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Country/Region:nk]> + Æ + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Metric:nk]> Percentile Rank: + <[federated.0luwvdb15h38a719e117k10zo3f4].[usr:Calculation_3198400214763864065:qk]> Percentile + + + + + + + + + + + + + + + + + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Country/Region:nk]> + Æ + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Metric:nk]> Percentile Rank: + <[federated.0luwvdb15h38a719e117k10zo3f4].[usr:Calculation_3198400214763864065:qk]> Percentile + + + + + + ([federated.0luwvdb15h38a719e117k10zo3f4].[rank:avg:Value:qk:7] + [federated.0luwvdb15h38a719e117k10zo3f4].[rank:avg:Value:qk:7]) + [federated.0luwvdb15h38a719e117k10zo3f4].[none:Metric:nk] +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__pictogram__count-with-repeated-icons-whole-numbers-only.tbm b/plugins/tableau/resources/templates/reference/magnitude__pictogram__count-with-repeated-icons-whole-numbers-only.tbm new file mode 100644 index 0000000..5f534b4 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__pictogram__count-with-repeated-icons-whole-numbers-only.tbm @@ -0,0 +1,619 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + QUESTION + 129 + [QUESTION] + [Extract] + QUESTION + 0 + string + Count + 20 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Q + 129 + [Q] + [Extract] + Q + 1 + string + Count + 20 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Answer + 5 + [Answer] + [Extract] + Answer + 2 + real + Sum + 464 + true + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + RespID + 20 + [RespID] + [Extract] + RespID + 3 + integer + Sum + 1714 + true + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Gender + 129 + [Gender] + [Extract] + Gender + 4 + string + Count + 2 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Location + 129 + [Location] + [Extract] + Location + 5 + string + Count + 6 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Generation + 129 + [Generation] + [Extract] + Generation + 6 + string + Count + 4 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Weight + 5 + [Weight] + [Extract] + Weight + 7 + real + Sum + 8 + true + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Question ID + 129 + [Question ID] + [Extract] + Question ID + 8 + string + Count + 20 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Wording + 129 + [Wording] + [Extract] + Wording + 9 + string + Count + 20 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Question Grouping + 129 + [Question Grouping] + [Extract] + Question Grouping + 10 + string + Count + 4 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + Question Type + 129 + [Question Type] + [Extract] + Question Type + 11 + string + Count + 4 + true + + [Extract (Extract.Extract)_8EB3E64D9145413880F3922DEE6B8197] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Male" + "Female" + + + + + + + + 2 + 1 + + + + [federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Location:nk] + + + + + + + + + + + + + + + + + + + <[federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Gender:nk]> - <[federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Generation:nk]> + Æ + + + + + + [federated.0sqeay81nbhomo1gxl1y71cdj990].[usr:Calculation_2535526642859171842:ok:20] + ([federated.0sqeay81nbhomo1gxl1y71cdj990].[none:Generation:nk] / [federated.0sqeay81nbhomo1gxl1y71cdj990].[usr:Calculation_2535526642859171842:ok:14]) +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__proportional-symbol__show-size-when-fine-differences-do-not-matter.tbm b/plugins/tableau/resources/templates/reference/magnitude__proportional-symbol__show-size-when-fine-differences-do-not-matter.tbm new file mode 100644 index 0000000..18cea79 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__proportional-symbol__show-size-when-fine-differences-do-not-matter.tbm @@ -0,0 +1,1403 @@ + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + Birth Rate + 5 + [Birth Rate] + [Extract] + Birth Rate + 0 + World Indicators.csv + real + Sum + 47 + true + [Migrated Data] + + + Business Tax Rate + 5 + [Business Tax Rate] + [Extract] + Business Tax Rate + 1 + World Indicators.csv + real + Sum + 397 + true + [Migrated Data] + + + CO2 Emissions + 20 + [CO2 Emissions] + [Extract] + CO2 Emissions + 2 + World Indicators.csv + integer + Sum + 1261 + true + [Migrated Data] + + + Country/Region + 129 + [Country/Region] + [Extract] + Country/Region + 3 + World Indicators.csv + string + Count + 208 + true + + [Migrated Data] + + + Days to Start Business + 20 + [Days to Start Business] + [Extract] + Days to Start Business + 4 + World Indicators.csv + integer + Sum + 115 + true + [Migrated Data] + + + Ease of Business + 20 + [Ease of Business] + [Extract] + Ease of Business + 5 + World Indicators.csv + integer + Sum + 334 + true + [Migrated Data] + + + Energy Usage + 20 + [Energy Usage] + [Extract] + Energy Usage + 6 + World Indicators.csv + integer + Sum + 1520 + true + [Migrated Data] + + + GDP + 20 + [GDP] + [Extract] + GDP + 7 + World Indicators.csv + integer + Sum + 1605 + true + [Migrated Data] + + + Health Exp % GDP + 5 + [Health Exp % GDP] + [Extract] + Health Exp % GDP + 8 + World Indicators.csv + real + Sum + 131 + true + [Migrated Data] + + + Health Exp/Capita + 20 + [Health Exp/Capita] + [Extract] + Health Exp/Capita + 9 + World Indicators.csv + integer + Sum + 836 + true + [Migrated Data] + + + Hours to do Tax + 20 + [Hours to do Tax] + [Extract] + Hours to do Tax + 10 + World Indicators.csv + integer + Sum + 262 + true + [Migrated Data] + + + Infant Mortality Rate + 5 + [Infant Mortality Rate] + [Extract] + Infant Mortality Rate + 11 + World Indicators.csv + real + Sum + 128 + true + [Migrated Data] + + + Internet Usage + 5 + [Internet Usage] + [Extract] + Internet Usage + 12 + World Indicators.csv + real + Sum + 617 + true + [Migrated Data] + + + Lending Interest + 5 + [Lending Interest] + [Extract] + Lending Interest + 13 + World Indicators.csv + real + Sum + 319 + true + [Migrated Data] + + + Life Expectancy Female + 20 + [Life Expectancy Female] + [Extract] + Life Expectancy Female + 14 + World Indicators.csv + integer + Sum + 48 + true + [Migrated Data] + + + Life Expectancy Male + 20 + [Life Expectancy Male] + [Extract] + Life Expectancy Male + 15 + World Indicators.csv + integer + Sum + 47 + true + [Migrated Data] + + + Mobile Phone Usage + 5 + [Mobile Phone Usage] + [Extract] + Mobile Phone Usage + 16 + World Indicators.csv + real + Sum + 950 + true + [Migrated Data] + + + Population 0-14 + 5 + [Population 0-14] + [Extract] + Population 0-14 + 17 + World Indicators.csv + real + Sum + 391 + true + [Migrated Data] + + + Population 15-64 + 5 + [Population 15-64] + [Extract] + Population 15-64 + 18 + World Indicators.csv + real + Sum + 287 + true + [Migrated Data] + + + Population 65+ + 5 + [Population 65+] + [Extract] + Population 65+ + 19 + World Indicators.csv + real + Sum + 199 + true + [Migrated Data] + + + Population Total + 20 + [Population Total] + [Extract] + Population Total + 20 + World Indicators.csv + integer + Sum + 2691 + true + [Migrated Data] + + + Population Urban + 5 + [Population Urban] + [Extract] + Population Urban + 21 + World Indicators.csv + real + Sum + 782 + true + [Migrated Data] + + + Region + 129 + [Region] + [Extract] + Region + 22 + World Indicators.csv + string + Count + 6 + true + + [Migrated Data] + + + Tourism Inbound + 20 + [Tourism Inbound] + [Extract] + Tourism Inbound + 23 + World Indicators.csv + integer + Sum + 1207 + true + [Migrated Data] + + + Tourism Outbound + 20 + [Tourism Outbound] + [Extract] + Tourism Outbound + 24 + World Indicators.csv + integer + Sum + 1082 + true + [Migrated Data] + + + Year + 133 + [Year] + [Extract] + Year + 25 + World Indicators.csv + date + Year + 13 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [World Indicators].[sum:CO2 Emissions:qk] + [World Indicators].[yr:Year:ok] + [World Indicators].[none:Region:nk] + [World Indicators].[sum:GDP:qk] + + + + + + + + + + + + + + + + + + <[World Indicators].[none:Country/Region:nk]> + Æ + Total CO2 Emissions: + <[World Indicators].[avg:CO2 Emissions:qk]> + Æ + Total GDP: + <[World Indicators].[avg:GDP:qk]> + Æ + Total Population: + <[World Indicators].[sum:Population Total:qk]> + + + + + + [World Indicators].[avg:CO2 Emissions:qk] + [World Indicators].[avg:GDP:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__radar__compare-many-variables-for-one-or-few-entities.tbm b/plugins/tableau/resources/templates/reference/magnitude__radar__compare-many-variables-for-one-or-few-entities.tbm new file mode 100644 index 0000000..93daab5 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__radar__compare-many-variables-for-one-or-few-entities.tbm @@ -0,0 +1,1109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Metric + 129 + [Metric] + [Extract] + Metric + 0 + string + Count + 6 + true + + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + Value + 5 + [Value] + [Extract] + Value + 1 + real + Sum + 47 + true + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + Country/Region + 129 + [Country/Region] + [Extract] + Country/Region + 2 + string + Count + 48 + true + + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + Region + 129 + [Region] + [Extract] + Region + 3 + string + Count + 1 + true + + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + Year + 133 + [Year] + [Extract] + Year + 4 + date + Year + 1 + true + [Extract (Extract.Extract)_A383FBDAF4EB43879CEF3BE262079867] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Infant Mortality Percentile Rank" + "Energy Usage Percentile RANK" + "Birth Rate Percentile Rank" + "CO2 Percentile Rank" + "Health Exp Percentile Rank" + "GDP Percentile Rank" + + + + [federated.0luwvdb15h38a719e117k10zo3f4].[none:Country/Region:nk] + + + + + + + + + + + + + + + + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Country/Region:nk]> + Æ + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Metric:nk]>: + <[federated.0luwvdb15h38a719e117k10zo3f4].[sum:Value:qk]> + + + + + + + + + + + + + + + + + + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Country/Region:nk]> + Æ + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Metric:nk]>: + <[federated.0luwvdb15h38a719e117k10zo3f4].[sum:Value:qk]> + + + + + + + + + + + + + + + + + + Æ + <[federated.0luwvdb15h38a719e117k10zo3f4].[none:Metric:nk]>: + + + + + + [federated.0luwvdb15h38a719e117k10zo3f4].[usr:y (copy)_2126543503415336967:qk] + ([federated.0luwvdb15h38a719e117k10zo3f4].[usr:x (copy)_2126543503415009285:qk] + [federated.0luwvdb15h38a719e117k10zo3f4].[usr:x (copy)_2126543503415009285:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/magnitude__radial-bar__show-circular-relative-bars-or-progress.tbm b/plugins/tableau/resources/templates/reference/magnitude__radial-bar__show-circular-relative-bars-or-progress.tbm new file mode 100644 index 0000000..81d0cb7 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/magnitude__radial-bar__show-circular-relative-bars-or-progress.tbm @@ -0,0 +1,634 @@ + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + Pad + 20 + [Pad] + [Extract] + Pad + 0 + integer + Sum + 2 + true + [Extract (Extract.Extract)_042FD0C5E6C44EFF8B66C14236FBBB40] + + + % Population Urban + 5 + [% Population Urban] + [Extract] + % Population Urban + 1 + real + Sum + 6 + true + [Extract (Extract.Extract)_042FD0C5E6C44EFF8B66C14236FBBB40] + + + Region + 129 + [Region] + [Extract] + Region + 2 + string + Count + 6 + true + + [Extract (Extract.Extract)_042FD0C5E6C44EFF8B66C14236FBBB40] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Region:nk] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Pad (bin):ok] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Region:nk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[Pad (bin)] + + + + + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Pad (bin):ok] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Region:nk] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Max Value (copy)_1440926071332868:qk:3] + + + + 283 + "Oceania" + -0.2747734900495914 + -2.9873900865414225 + 0.51639999999999997 + + + + + + + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Pad (bin):ok] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Region:nk] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Max Value (copy)_1440926071332868:qk:3] + + + + 283 + "Asia" + -0.0149010113608017 + -1.999944489194744 + 0.50294117647058834 + + + + + + + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Pad (bin):ok] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Region:nk] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Max Value (copy)_1440926071332868:qk:3] + + + + 283 + "Africa" + 0.51209247763709254 + -0.85893031984410928 + 0.41588679245283028 + + + + + + + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Pad (bin):ok] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Region:nk] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Max Value (copy)_1440926071332868:qk:3] + + + + 283 + "Europe" + -4.7070138096979219 + -1.686422543526104 + 0.69768085106382971 + + + + + + + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Pad (bin):ok] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Region:nk] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Max Value (copy)_1440926071332868:qk:3] + + + + 283 + "The Americas" + -3.3939367004074921 + -2.116883008960841 + 0.66355813953488374 + + + + + + + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + + + + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Pad (bin):ok] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[none:Region:nk] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071603207:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Calculation_1440926071709704:qk:7] + [federated.0t13zrz1kvrxmp1ghyluy0ap2d64].[usr:Max Value (copy)_1440926071332868:qk:3] + + + + 283 + "Middle East" + -5.868885604402835 + 1.2474701449065515 + 0.78607692307692312 + + + + + + +
+
diff --git a/plugins/tableau/resources/templates/reference/pareto-chart.tbm b/plugins/tableau/resources/templates/reference/pareto-chart.tbm new file mode 100644 index 0000000..e861204 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/pareto-chart.tbm @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ([Sample - Superstore].[sum:Profit:qk] + [Sample - Superstore].[pcto:cum:sum:Profit:qk]) + [Sample - Superstore].[none:Customer Name:nk] +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole-proportional-stacked-bar.tbm b/plugins/tableau/resources/templates/reference/part-to-whole-proportional-stacked-bar.tbm new file mode 100644 index 0000000..c641521 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole-proportional-stacked-bar.tbm @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "South" + "Central" + "East" + "West" + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[pcto:sum:Profit:qk:3] +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole-waterfall.tbm b/plugins/tableau/resources/templates/reference/part-to-whole-waterfall.tbm new file mode 100644 index 0000000..c5afec7 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole-waterfall.tbm @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[cum:sum:Profit:qk] + [Sample - Superstore].[none:Customer Name:nk] +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__arc__schematic-hierarchical-breakdown-use-sparingly.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__arc__schematic-hierarchical-breakdown-use-sparingly.tbm new file mode 100644 index 0000000..fd6b5f3 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__arc__schematic-hierarchical-breakdown-use-sparingly.tbm @@ -0,0 +1,4351 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Category:nk]> + Æ + % of Total Sales: + <[Sample - EU Superstore].[usr:Calculation_1230327185363431426:qk:1]> + + + + + + [Sample - EU Superstore].[usr:9. X (copy)_1230327185373634573:qk:14] + [Sample - EU Superstore].[usr:Calculation_1230327185373503500:qk:14] +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__donut__show-parts-with-center-space-for-total.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__donut__show-parts-with-center-space-for-total.tbm new file mode 100644 index 0000000..d9f548c --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__donut__show-parts-with-center-space-for-total.tbm @@ -0,0 +1,4326 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + <[Sample - EU Superstore].[none:Segment:nk]> + Æ + <[Sample - EU Superstore].[pcto:ctd:Order ID:qk:3]> + of Total Orders + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Category:nk]> + Æ + <[Sample - EU Superstore].[pcto:ctd:Order ID:qk:3]> + of Total Orders + + + + + + + + + + + + + + + + Total Orders + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + ([Sample - EU Superstore].[usr:Calculation_3464112593791664145:qk] + [Sample - EU Superstore].[usr:Calculation_3464112593791664145:qk]) + +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__funnel__show-stage-dropoff-through-a-process.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__funnel__show-stage-dropoff-through-a-process.tbm new file mode 100644 index 0000000..9b42f81 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__funnel__show-stage-dropoff-through-a-process.tbm @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B5:no:A1:B5:0" + true + 6 + + + + Category + 130 + [Category] + [Sheet1] + Category + 0 + string + Count + true + + + "WSTR" + + [Sheet1_BCAA0043B4F2405EBA0EE46A436BF6CC] + + + Value + 20 + [Value] + [Sheet1] + Value + 1 + integer + Sum + true + + "I8" + + [Sheet1_BCAA0043B4F2405EBA0EE46A436BF6CC] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0ycp03o15aqa4t1gd5b301henmz0].[none:Category:nk] + + + + + + + + + + + + + + + + + + + + + + + + + + "[federated.0ycp03o15aqa4t1gd5b301henmz0].[__tableau_internal_object_id__].[cnt:Sheet1_BCAA0043B4F2405EBA0EE46A436BF6CC:qk]" + "[federated.0ycp03o15aqa4t1gd5b301henmz0].[sum:Value:qk]" + "[federated.0ycp03o15aqa4t1gd5b301henmz0].[usr:Calculation_1440926082236429:qk]" + + + + [federated.0ycp03o15aqa4t1gd5b301henmz0].[:Measure Names] + + + + + + + + + + + + + + + + <[federated.0ycp03o15aqa4t1gd5b301henmz0].[none:Category:nk]>: + <[federated.0ycp03o15aqa4t1gd5b301henmz0].[Multiple Values]> + + + + + + + + + + + + + + + <[federated.0ycp03o15aqa4t1gd5b301henmz0].[none:Category:nk]>: + <[federated.0ycp03o15aqa4t1gd5b301henmz0].[Multiple Values]> + + + + + + + + + + + + + + + + <[federated.0ycp03o15aqa4t1gd5b301henmz0].[none:Category:nk]>: + <[federated.0ycp03o15aqa4t1gd5b301henmz0].[Multiple Values]> + + + + + + [federated.0ycp03o15aqa4t1gd5b301henmz0].[none:Category:nk] + ([federated.0ycp03o15aqa4t1gd5b301henmz0].[Multiple Values] + [federated.0ycp03o15aqa4t1gd5b301henmz0].[Multiple Values]) +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__marimekko__encode-share-with-both-width-and-height.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__marimekko__encode-share-with-both-width-and-height.tbm new file mode 100644 index 0000000..d65cfd5 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__marimekko__encode-share-with-both-width-and-height.tbm @@ -0,0 +1,4281 @@ + + + + + + + + + + + + + + + + + + <formatted-text /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Delivery Mode:nk] + + + + + + + + + + + + + + + + + + + Delivery Mode - + <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Segment - + <[Sample - EU Superstore].[none:Segment:nk]> + Æ + Total Orders: <[Sample - EU Superstore].[sum:Calculation_1690820235271180288:qk]> + Æ + % of <[Sample - EU Superstore].[none:Delivery Mode:nk]> Total: <[Sample - EU Superstore].[pcto:ctd:Order ID:qk:5]> + + + + + + [Sample - EU Superstore].[pcto:ctd:Order ID:qk:5] + [Sample - EU Superstore].[cum:sum:Calculation_1690820235271180288:qk:2] +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__pie__simple-few-part-composition.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__pie__simple-few-part-composition.tbm new file mode 100644 index 0000000..aa3f6f8 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__pie__simple-few-part-composition.tbm @@ -0,0 +1,4256 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + <[Sample - EU Superstore].[none:Category:nk]> + Æ + <[Sample - EU Superstore].[pcto:ctd:Order ID:qk:3]> + of Total Orders + + + + + + [Sample - EU Superstore].[usr:Calculation_1230327185361571841:qk] + +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__polar-area__compare-parts-on-a-radial-axis.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__polar-area__compare-parts-on-a-radial-axis.tbm new file mode 100644 index 0000000..bc38654 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__polar-area__compare-parts-on-a-radial-axis.tbm @@ -0,0 +1,687 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:A104:no:A1:A104:0" + true + 6 + + + + Percentile Rank + 5 + [Percentile Rank] + [Extract] + Percentile Rank + 0 + real + Sum + 19 + true + [Extract (Extract.Extract)_2363FB1A4F434CB184243B518D96DB24] + + + Metric + 129 + [Metric] + [Extract] + Metric + 1 + string + Count + 10 + true + + [Extract (Extract.Extract)_2363FB1A4F434CB184243B518D96DB24] + + + team + 129 + [team] + [Extract] + team + 2 + string + Count + 3 + true + + [Extract (Extract.Extract)_2363FB1A4F434CB184243B518D96DB24] + + + player + 129 + [player] + [Extract] + player + 3 + string + Count + 3 + true + + [Extract (Extract.Extract)_2363FB1A4F434CB184243B518D96DB24] + + + Pad + 20 + [Pad] + [Sheet1] + Pad + 4 + integer + Sum + true + + "I8" + + [Sheet1_DD2C9AE4B947401EB520BA2FEC5C298F] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0ekaykw02fhokp0zlnc6r075pqpt].[none:player:nk] + + + + + + + + + + + + + + + + + + + + <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[none:player:nk]> + Æ + <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[none:Metric:nk]> + Æ + Percentile Rank: + <[federated.0ekaykw02fhokp0zlnc6r075pqpt].[sum:Percentile Rank:qk]> + + + + + + [federated.0ekaykw02fhokp0zlnc6r075pqpt].[usr:Calculation_674414107083878420:qk:9] + [federated.0ekaykw02fhokp0zlnc6r075pqpt].[usr:Calculation_674414107083653139:qk:13] +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__proportional-stacked-bar__show-size-and-share-together.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__proportional-stacked-bar__show-size-and-share-together.tbm new file mode 100644 index 0000000..d90ed40 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__proportional-stacked-bar__show-size-and-share-together.tbm @@ -0,0 +1,1410 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>A good way of showing the size and proportion of data at the same time – as long as the data are not too complicated.</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Migrated Data] + + + Ship Date + 7 + [Ship Date] + [Orders] + Ship Date + 3 + date + Year + true + + "DATE" + + [Migrated Data] + + + Ship Mode + 130 + [Ship Mode] + [Orders] + Ship Mode + 4 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Country + 130 + [Country] + [Orders] + Country + 8 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + City + 130 + [City] + [Orders] + City + 9 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + State + 130 + [State] + [Orders] + State + 10 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Postal Code + 20 + [Postal Code] + [Orders] + Postal Code + 11 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Region + 130 + [Region] + [Orders] + Region + 12 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 13 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Category + 130 + [Category] + [Orders] + Category + 14 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 15 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 16 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Sales + 5 + [Sales] + [Orders] + Sales + 17 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 18 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Discount + 5 + [Discount] + [Orders] + Discount + 19 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Profit + 5 + [Profit] + [Orders] + Profit + 20 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U9995:no:A1:U9995:0" + true + 6 + + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ -1 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Row ID + 20 + [Row ID] + [Extract] + Row ID + 0 + Orders + integer + Sum + 9994 + true + [Migrated Data] + + + Order ID + 129 + [Order ID] + [Extract] + Order ID + 1 + Orders + string + Count + 3397 + true + + [Migrated Data] + + + Order Date + 133 + [Order Date] + [Extract] + Order Date + 2 + Orders + date + Year + 1373 + true + [Migrated Data] + + + Ship Date + 133 + [Ship Date] + [Extract] + Ship Date + 3 + Orders + date + Year + 1492 + true + [Migrated Data] + + + Ship Mode + 129 + [Ship Mode] + [Extract] + Ship Mode + 4 + Orders + string + Count + 4 + true + + [Migrated Data] + + + Customer ID + 129 + [Customer ID] + [Extract] + Customer ID + 5 + Orders + string + Count + 1128 + true + + [Migrated Data] + + + Customer Name + 129 + [Customer Name] + [Extract] + Customer Name + 6 + Orders + string + Count + 1128 + true + + [Migrated Data] + + + Segment + 129 + [Segment] + [Extract] + Segment + 7 + Orders + string + Count + 3 + true + + [Migrated Data] + + + Country + 129 + [Country] + [Extract] + Country + 8 + Orders + string + Count + 1 + true + + [Migrated Data] + + + City + 129 + [City] + [Extract] + City + 9 + Orders + string + Count + 566 + true + + [Migrated Data] + + + State + 129 + [State] + [Extract] + State + 10 + Orders + string + Count + 53 + true + + [Migrated Data] + + + Postal Code + 20 + [Postal Code] + [Extract] + Postal Code + 11 + Orders + integer + Sum + 676 + true + [Migrated Data] + + + Region + 129 + [Region] + [Extract] + Region + 12 + Orders + string + Count + 4 + true + + [Migrated Data] + + + Product ID + 129 + [Product ID] + [Extract] + Product ID + 13 + Orders + string + Count + 2000 + true + + [Migrated Data] + + + Category + 129 + [Category] + [Extract] + Category + 14 + Orders + string + Count + 3 + true + + [Migrated Data] + + + Sub-Category + 129 + [Sub-Category] + [Extract] + Sub-Category + 15 + Orders + string + Count + 17 + true + + [Migrated Data] + + + Product Name + 129 + [Product Name] + [Extract] + Product Name + 16 + Orders + string + Count + 1989 + true + + [Migrated Data] + + + Sales + 5 + [Sales] + [Extract] + Sales + 17 + Orders + real + Sum + 3494 + true + [Migrated Data] + + + Quantity + 20 + [Quantity] + [Extract] + Quantity + 18 + Orders + integer + Sum + 13 + true + [Migrated Data] + + + Discount + 5 + [Discount] + [Extract] + Discount + 19 + Orders + real + Sum + 11 + true + [Migrated Data] + + + Profit + 5 + [Profit] + [Extract] + Profit + 20 + Orders + real + Sum + 4049 + true + [Migrated Data] + + + + + + + + + + + + + + "Actual" + "Estimate" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Region:nk] + [Sample - Superstore].[pcto:sum:Sales:qk:2] +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__stacked-column__compare-composition-across-categories.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__stacked-column__compare-composition-across-categories.tbm new file mode 100644 index 0000000..8a4b271 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__stacked-column__compare-composition-across-categories.tbm @@ -0,0 +1,4260 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[yr:Order Date:ok]> + <[Sample - EU Superstore].[none:Segment:nk]> + Æ + <[Sample - EU Superstore].[pcto:ctd:Order ID:qk:3]> + of Total Orders + + + + + + [Sample - EU Superstore].[pcto:ctd:Order ID:qk:3] + [Sample - EU Superstore].[yr:Order Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__sunburst__show-nested-hierarchy-as-rings.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__sunburst__show-nested-hierarchy-as-rings.tbm new file mode 100644 index 0000000..e470d85 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__sunburst__show-nested-hierarchy-as-rings.tbm @@ -0,0 +1,4383 @@ + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Segment:nk]> - <[Sample - EU Superstore].[none:Category (copy)_1230327185380192275:nk]> - <[Sample - EU Superstore].[none:Region (copy)_1230327185378156562:nk]> + Total Sales: + Æ + <[Sample - EU Superstore].[pcto:sum:Sales:qk]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Category (copy)_1230327185380192275:nk]> - <[Sample - EU Superstore].[none:Region (copy)_1230327185378156562:nk]> + Total Sales: + Æ + <[Sample - EU Superstore].[pcto:sum:Sales:qk]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Region (copy)_1230327185378156562:nk]> + Total Sales: + Æ + <[Sample - EU Superstore].[pcto:sum:Sales:qk]> + + + + + + [Sample - EU Superstore].[Latitude (generated)] + [Sample - EU Superstore].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__treemap__show-hierarchical-sizes-in-nested-rectangles.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__treemap__show-hierarchical-sizes-in-nested-rectangles.tbm new file mode 100644 index 0000000..9c5716b --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__treemap__show-hierarchical-sizes-in-nested-rectangles.tbm @@ -0,0 +1,4252 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Country/Region:nk]> + , + <[Sample - EU Superstore].[none:Region:nk]> + Æ + <[Sample - EU Superstore].[pcto:sum:Sales:qk]> + of Total Sales + + + + + + + +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__unit-grid__show-percentages-as-filled-cells.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__unit-grid__show-percentages-as-filled-cells.tbm new file mode 100644 index 0000000..a07a274 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__unit-grid__show-percentages-as-filled-cells.tbm @@ -0,0 +1,4464 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + Row + 20 + [Row] + [Extract] + Row + 0 + Waffle - Sheet1.csv + integer + Sum + 10 + true + [Extract (Extract.Extract)_27F043AF92BC49A08782D1C4E18C60CA] + + + Column + 20 + [Column] + [Extract] + Column + 1 + Waffle - Sheet1.csv + integer + Sum + 10 + true + [Extract (Extract.Extract)_27F043AF92BC49A08782D1C4E18C60CA] + + + Percentage + 5 + [Percentage] + [Extract] + Percentage + 2 + Waffle - Sheet1.csv + real + Sum + 100 + true + [Extract (Extract.Extract)_27F043AF92BC49A08782D1C4E18C60CA] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Profit Ratio: + <[Sample - EU Superstore].[usr:Calculation_1368249927221915648:qk]> + + + + + + [federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[none:Row:ok] + ([federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[none:Column:ok] * [federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[usr:Calculation_722827798441152513:qk]) + + + + < + [Sample - EU Superstore].[usr:Calculation_1368249927221915648:qk] + > + + + + + + + + [federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[none:Column:ok] + [federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[usr:Calculation_722827798441152513:qk] + + + [federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[none:Row:ok] + + + + [federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[none:Column:ok] + [federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[none:Row:ok] + [Sample - EU Superstore].[usr:Calculation_1368249927221915648:qk] + [federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[usr:Calculation_722827798441152513:qk] + [federated.1or5ea20ktzg3y11wyj1a1k8aw9q].[usr:Calculation_722827798444875779:nk] + + + + 5 + 6 + 0.12563614805849327 + 1.0 + false + + + + + + + +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__venn__schematic-overlap-between-sets.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__venn__schematic-overlap-between-sets.tbm new file mode 100644 index 0000000..6d4fc9e --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__venn__schematic-overlap-between-sets.tbm @@ -0,0 +1,4370 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Region:nk] + + + + + + + + + + + + + + Total Customers + Æ + <[Sample - EU Superstore].[none:Region:nk]> - + <[Sample - EU Superstore].[ctd:Customer Name:qk]> + Æ + Both - + <[Sample - EU Superstore].[usr:Calculation_3428928227010703362:qk]> + + + + + + + + + + + + + + + + + + Total Customers + Æ + <[Sample - EU Superstore].[none:Region:nk]> - + <[Sample - EU Superstore].[ctd:Customer Name:qk]> + Æ + Both - + <[Sample - EU Superstore].[usr:Calculation_3428928227010703362:qk]> + + + + + + + + + + + + + + + + Total Customers + Æ + <[Sample - EU Superstore].[none:Region:nk]> - + <[Sample - EU Superstore].[ctd:Customer Name:qk]> + Æ + Both - + <[Sample - EU Superstore].[usr:Calculation_3428928227010703362:qk]> + + + + + < + [Sample - EU Superstore].[usr:Calculation_3428928227010703362:qk] + > + + + + + + [Sample - EU Superstore].[min:Calculation_3428928227011305477:qk] + ([Sample - EU Superstore].[usr:Calculation_3428928227010420736:qk] + [Sample - EU Superstore].[usr:Calculation_3428928227010629633:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/part-to-whole__waterfall__bridge-start-to-end-with-plus-minus-steps.tbm b/plugins/tableau/resources/templates/reference/part-to-whole__waterfall__bridge-start-to-end-with-plus-minus-steps.tbm new file mode 100644 index 0000000..c3a3731 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/part-to-whole__waterfall__bridge-start-to-end-with-plus-minus-steps.tbm @@ -0,0 +1,427 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> (vertical)</run> + <run>Æ </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:E2:no:A1:E2:0" + true + 6 + + + + Region + 130 + [Region] + [Sheet1] + Region + 0 + string + Count + true + + + "WSTR" + + [Sheet1_18377676AB764F25A15F8865E5C0EB30] + + + Pivot Field Names + 129 + [Pivot Field Names] + [Pivot] + Pivot Field Names + 1 + string + Count + true + [Sheet1_18377676AB764F25A15F8865E5C0EB30] + + + Pivot Field Values + 20 + [Pivot Field Values] + [Pivot] + Pivot Field Values + 2 + integer + Sum + true + [Sheet1_18377676AB764F25A15F8865E5C0EB30] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "Sales" + "Cost" + "Expenses" + "Profit" + + + + + + + + + + + + + + + + + + + + <[federated.1h2onm80d10fnc0zqfka50nszgpx].[none:Pivot Field Names:nk]> + : <[federated.1h2onm80d10fnc0zqfka50nszgpx].[sum:Pivot Field Values:qk]> + + + + + + [federated.1h2onm80d10fnc0zqfka50nszgpx].[cum:usr:Calculation_3900961764665905157:qk] + [federated.1h2onm80d10fnc0zqfka50nszgpx].[none:Pivot Field Names:nk] +
+
diff --git a/plugins/tableau/resources/templates/reference/ranking-bump-chart.tbm b/plugins/tableau/resources/templates/reference/ranking-bump-chart.tbm new file mode 100644 index 0000000..ef5a21b --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ranking-bump-chart.tbm @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[yr:Order Date:ok] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ([Sample - Superstore].[usr:Calculation_508343847073411072:qk:1] + [Sample - Superstore].[usr:Calculation_508343847073411072:qk:1]) + ([Sample - Superstore].[yr:Order Date:ok] / [Sample - Superstore].[mn:Order Date:ok]) +
+
diff --git a/plugins/tableau/resources/templates/reference/ranking__bump__track-rank-changes-across-many-periods.tbm b/plugins/tableau/resources/templates/reference/ranking__bump__track-rank-changes-across-many-periods.tbm new file mode 100644 index 0000000..66f08bc --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ranking__bump__track-rank-changes-across-many-periods.tbm @@ -0,0 +1,4365 @@ + + + + + + + + + + + + + + + + + + + <formatted-text /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Region:nk] + [Sample - EU Superstore].[none:Country/Region:nk] + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Country/Region:nk]> <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Rank: + Æ + <[Sample - EU Superstore].[rank:ctd:Order ID:qk:9]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Country/Region:nk]> <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Rank: + Æ + <[Sample - EU Superstore].[rank:ctd:Order ID:qk:9]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + < + [Sample - EU Superstore].[none:Country/Region:nk] + > + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Country/Region:nk]> <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Rank: + Æ + <[Sample - EU Superstore].[rank:ctd:Order ID:qk:9]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + < + [Sample - EU Superstore].[rank:ctd:Order ID:qk:9] + > + + + + + + ([Sample - EU Superstore].[rank:ctd:Order ID:qk:9] + [Sample - EU Superstore].[rank:ctd:Order ID:qk:9]) + [Sample - EU Superstore].[yr:Order Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/ranking__dot-strip__space-efficient-ranks-across-many-categories.tbm b/plugins/tableau/resources/templates/reference/ranking__dot-strip__space-efficient-ranks-across-many-categories.tbm new file mode 100644 index 0000000..435afc1 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ranking__dot-strip__space-efficient-ranks-across-many-categories.tbm @@ -0,0 +1,1432 @@ + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>Dots placed in order on a strip are a space-efficient method of laying out ranks across multiple categories.</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Migrated Data] + + + Ship Date + 7 + [Ship Date] + [Orders] + Ship Date + 3 + date + Year + true + + "DATE" + + [Migrated Data] + + + Ship Mode + 130 + [Ship Mode] + [Orders] + Ship Mode + 4 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Country + 130 + [Country] + [Orders] + Country + 8 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + City + 130 + [City] + [Orders] + City + 9 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + State + 130 + [State] + [Orders] + State + 10 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Postal Code + 20 + [Postal Code] + [Orders] + Postal Code + 11 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Region + 130 + [Region] + [Orders] + Region + 12 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 13 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Category + 130 + [Category] + [Orders] + Category + 14 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 15 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 16 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Sales + 5 + [Sales] + [Orders] + Sales + 17 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 18 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Discount + 5 + [Discount] + [Orders] + Discount + 19 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Profit + 5 + [Profit] + [Orders] + Profit + 20 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U9995:no:A1:U9995:0" + true + 6 + + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ -1 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Row ID + 20 + [Row ID] + [Extract] + Row ID + 0 + Orders + integer + Sum + 9994 + true + [Migrated Data] + + + Order ID + 129 + [Order ID] + [Extract] + Order ID + 1 + Orders + string + Count + 3397 + true + + [Migrated Data] + + + Order Date + 133 + [Order Date] + [Extract] + Order Date + 2 + Orders + date + Year + 1373 + true + [Migrated Data] + + + Ship Date + 133 + [Ship Date] + [Extract] + Ship Date + 3 + Orders + date + Year + 1492 + true + [Migrated Data] + + + Ship Mode + 129 + [Ship Mode] + [Extract] + Ship Mode + 4 + Orders + string + Count + 4 + true + + [Migrated Data] + + + Customer ID + 129 + [Customer ID] + [Extract] + Customer ID + 5 + Orders + string + Count + 1128 + true + + [Migrated Data] + + + Customer Name + 129 + [Customer Name] + [Extract] + Customer Name + 6 + Orders + string + Count + 1128 + true + + [Migrated Data] + + + Segment + 129 + [Segment] + [Extract] + Segment + 7 + Orders + string + Count + 3 + true + + [Migrated Data] + + + Country + 129 + [Country] + [Extract] + Country + 8 + Orders + string + Count + 1 + true + + [Migrated Data] + + + City + 129 + [City] + [Extract] + City + 9 + Orders + string + Count + 566 + true + + [Migrated Data] + + + State + 129 + [State] + [Extract] + State + 10 + Orders + string + Count + 53 + true + + [Migrated Data] + + + Postal Code + 20 + [Postal Code] + [Extract] + Postal Code + 11 + Orders + integer + Sum + 676 + true + [Migrated Data] + + + Region + 129 + [Region] + [Extract] + Region + 12 + Orders + string + Count + 4 + true + + [Migrated Data] + + + Product ID + 129 + [Product ID] + [Extract] + Product ID + 13 + Orders + string + Count + 2000 + true + + [Migrated Data] + + + Category + 129 + [Category] + [Extract] + Category + 14 + Orders + string + Count + 3 + true + + [Migrated Data] + + + Sub-Category + 129 + [Sub-Category] + [Extract] + Sub-Category + 15 + Orders + string + Count + 17 + true + + [Migrated Data] + + + Product Name + 129 + [Product Name] + [Extract] + Product Name + 16 + Orders + string + Count + 1989 + true + + [Migrated Data] + + + Sales + 5 + [Sales] + [Extract] + Sales + 17 + Orders + real + Sum + 3494 + true + [Migrated Data] + + + Quantity + 20 + [Quantity] + [Extract] + Quantity + 18 + Orders + integer + Sum + 13 + true + [Migrated Data] + + + Discount + 5 + [Discount] + [Extract] + Discount + 19 + Orders + real + Sum + 11 + true + [Migrated Data] + + + Profit + 5 + [Profit] + [Extract] + Profit + 20 + Orders + real + Sum + 4049 + true + [Migrated Data] + + + + + + + + + + + + + + "Actual" + "Estimate" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[mn:Order Date:ok] + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[mn:Order Date:ok] + [Sample - Superstore].[sum:Sales:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/ranking__lollipop__rank-and-highlight-values-with-less-ink.tbm b/plugins/tableau/resources/templates/reference/ranking__lollipop__rank-and-highlight-values-with-less-ink.tbm new file mode 100644 index 0000000..12cac67 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ranking__lollipop__rank-and-highlight-values-with-less-ink.tbm @@ -0,0 +1,4298 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + ([Sample - EU Superstore].[none:Delivery Mode:nk] / [Sample - EU Superstore].[rank:ctd:Order ID:ok]) + ([Sample - EU Superstore].[ctd:Order ID:qk] + [Sample - EU Superstore].[ctd:Order ID:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/ranking__ordered-bar__show-order-when-rank-matters-more-than-value.tbm b/plugins/tableau/resources/templates/reference/ranking__ordered-bar__show-order-when-rank-matters-more-than-value.tbm new file mode 100644 index 0000000..69d35e6 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ranking__ordered-bar__show-order-when-rank-matters-more-than-value.tbm @@ -0,0 +1,4297 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + ([Sample - EU Superstore].[none:Delivery Mode:nk] / [Sample - EU Superstore].[rank:ctd:Order ID:ok]) + ([Sample - EU Superstore].[ctd:Order ID:qk] + [Sample - EU Superstore].[ctd:Order ID:qk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/ranking__ordered-column__show-order-when-rank-matters-more-than-value.tbm b/plugins/tableau/resources/templates/reference/ranking__ordered-column__show-order-when-rank-matters-more-than-value.tbm new file mode 100644 index 0000000..423f22a --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ranking__ordered-column__show-order-when-rank-matters-more-than-value.tbm @@ -0,0 +1,4297 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + + + + + + + Delivery Mode - <[Sample - EU Superstore].[none:Delivery Mode:nk]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + ([Sample - EU Superstore].[ctd:Order ID:qk] + [Sample - EU Superstore].[ctd:Order ID:qk]) + ([Sample - EU Superstore].[rank:ctd:Order ID:ok:2] / [Sample - EU Superstore].[none:Delivery Mode:nk]) +
+
diff --git a/plugins/tableau/resources/templates/reference/ranking__ordered-proportional-symbol__rank-with-large-value-spreads.tbm b/plugins/tableau/resources/templates/reference/ranking__ordered-proportional-symbol__rank-with-large-value-spreads.tbm new file mode 100644 index 0000000..45f2e35 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ranking__ordered-proportional-symbol__rank-with-large-value-spreads.tbm @@ -0,0 +1,4273 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[qr:Order Date:ok]> + Æ + Total Orders: + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + <[Sample - EU Superstore].[qr:Order Date:ok]> + Æ + <[Sample - EU Superstore].[ctd:Order ID:qk]> + + + + + + + [Sample - EU Superstore].[rank:ctd:Order ID:qk:12] +
+
diff --git a/plugins/tableau/resources/templates/reference/ranking__slope-rank__show-rank-swaps-between-two-periods.tbm b/plugins/tableau/resources/templates/reference/ranking__slope-rank__show-rank-swaps-between-two-periods.tbm new file mode 100644 index 0000000..0d129f7 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ranking__slope-rank__show-rank-swaps-between-two-periods.tbm @@ -0,0 +1,4383 @@ + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name> </run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + [Sample - EU Superstore].[none:Category:nk] + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Sub-Category:nk]> - <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + Æ + Rank within Year: + <[Sample - EU Superstore].[rank:sum:Sales:qk:3]> + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Sub-Category:nk]> - <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + Æ + Rank within Year: + <[Sample - EU Superstore].[rank:sum:Sales:qk:3]> + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Sub-Category:nk]> - <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + Æ + Rank within Year: + <[Sample - EU Superstore].[rank:sum:Sales:qk:3]> + + + + + + ([Sample - EU Superstore].[rank:sum:Sales:qk:3] + [Sample - EU Superstore].[rank:sum:Sales:qk:3]) + [Sample - EU Superstore].[yr:Order Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/ranking__slope__compare-rank-or-value-change-between-two-points.tbm b/plugins/tableau/resources/templates/reference/ranking__slope__compare-rank-or-value-change-between-two-points.tbm new file mode 100644 index 0000000..eb91e1b --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ranking__slope__compare-rank-or-value-change-between-two-points.tbm @@ -0,0 +1,4369 @@ + + + + + + + + + + + + + + + + + + + <formatted-text> + <run fontcolor='#40414c' fontname='Tableau Semibold' fontsize='12'><Sheet Name></run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[yr:Order Date:ok] + [Sample - EU Superstore].[none:Category:nk] + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Sub-Category:nk]> - <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + Æ + Difference in Sales 2022 - 2025: + <[Sample - EU Superstore].[sum:Calculation_1992279925713322002:qk]> + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Sub-Category:nk]> - <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + Æ + Difference in Sales 2022 - 2025: + <[Sample - EU Superstore].[sum:Calculation_1992279925713322002:qk]> + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Sub-Category:nk]> - <[Sample - EU Superstore].[yr:Order Date:ok]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + Æ + Difference in Sales 2022 - 2025: + <[Sample - EU Superstore].[sum:Calculation_1992279925713322002:qk]> + + + + + + ([Sample - EU Superstore].[sum:Sales:qk] + [Sample - EU Superstore].[sum:Sales:qk]) + [Sample - EU Superstore].[yr:Order Date:ok] +
+
diff --git a/plugins/tableau/resources/templates/reference/sankey-viz-extension.tbm b/plugins/tableau/resources/templates/reference/sankey-viz-extension.tbm new file mode 100644 index 0000000..2e994cd --- /dev/null +++ b/plugins/tableau/resources/templates/reference/sankey-viz-extension.tbm @@ -0,0 +1,336 @@ + + + + + + + + + + + + <_.fcp.VizExtensionsDupEncodingUUID.true...VizExtensionsDupEncodingUUID /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [worldcup-standings-tableau.csv] + + Count + true + + "UTF-8" + "en_US" + "," + "true" + "en_US" + "" + + + + country + 129 + [country] + [worldcup-standings-tableau.csv] + country + 0 + string + Count + 1 + 1073741823 + true + + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + countryCode + 129 + [countryCode] + [worldcup-standings-tableau.csv] + countryCode + 1 + string + Count + 1 + 1073741823 + true + + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + group + 129 + [group] + [worldcup-standings-tableau.csv] + group + 2 + string + Count + 1 + 1073741823 + true + + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + position + 20 + [position] + [worldcup-standings-tableau.csv] + position + 3 + integer + Sum + true + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + played + 20 + [played] + [worldcup-standings-tableau.csv] + played + 4 + integer + Sum + true + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + won + 20 + [won] + [worldcup-standings-tableau.csv] + won + 5 + integer + Sum + true + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + drawn + 20 + [drawn] + [worldcup-standings-tableau.csv] + drawn + 6 + integer + Sum + true + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + lost + 20 + [lost] + [worldcup-standings-tableau.csv] + lost + 7 + integer + Sum + true + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + goalsFor + 20 + [goalsFor] + [worldcup-standings-tableau.csv] + goalsFor + 8 + integer + Sum + true + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + goalsAgainst + 20 + [goalsAgainst] + [worldcup-standings-tableau.csv] + goalsAgainst + 9 + integer + Sum + true + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + points + 20 + [points] + [worldcup-standings-tableau.csv] + points + 10 + integer + Sum + true + [worldcup-standings-tableau.csv_5A3A8A104E604BF0A28B029C13919047] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0sws74t0fh46kq19oyksf18yjlvo].[none:country:nk] + [federated.0sws74t0fh46kq19oyksf18yjlvo].[none:group:nk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[sum:Profit:qk] + [Sample - Superstore].[tqr:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial-choropleth-map.tbm b/plugins/tableau/resources/templates/reference/spatial-choropleth-map.tbm new file mode 100644 index 0000000..aa09e54 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial-choropleth-map.tbm @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[Latitude (generated)] + [Sample - Superstore].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial-symbol-map-latlon.tbm b/plugins/tableau/resources/templates/reference/spatial-symbol-map-latlon.tbm new file mode 100644 index 0000000..a5db2c7 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial-symbol-map-latlon.tbm @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[avg:Sales:qk] + [Sample - Superstore].[avg:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial-symbol-map.tbm b/plugins/tableau/resources/templates/reference/spatial-symbol-map.tbm new file mode 100644 index 0000000..11f78d3 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial-symbol-map.tbm @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[Latitude (generated)] + [Sample - Superstore].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__cartogram__resize-regions-by-a-value.tbm b/plugins/tableau/resources/templates/reference/spatial__cartogram__resize-regions-by-a-value.tbm new file mode 100644 index 0000000..e580896 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__cartogram__resize-regions-by-a-value.tbm @@ -0,0 +1,622 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + 20 + [id] + [5 Background.shp] + id + 0 + integer + Sum + true + [5 Background.shp_62EE71AC49C3439590A31E7F3AFAAF4E] + + + Name + 129 + [Name] + [5 Background.shp] + Name + 1 + string + Count + true + + [5 Background.shp_62EE71AC49C3439590A31E7F3AFAAF4E] + + + Geometry + 8 + [Geometry] + [5 Background.shp] + Geometry + 2 + spatial + Collect + true + [5 Background.shp_62EE71AC49C3439590A31E7F3AFAAF4E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [uk_group_population.csv] + + Count + true + + "UTF-8" + "en_GB" + "£" + "," + "true" + "en_GB" + "" + + + + Group + 129 + [Group] + [2 Group outlines.shp] + Group + 0 + string + Count + true + + [2 Group outlines.shp_99EEC23FE2D64DDBA7FE7D2FAE4CDD6B] + + + Group-labe + 129 + [Group-labe] + [2 Group outlines.shp] + Group-labe + 1 + string + Count + true + + [2 Group outlines.shp_99EEC23FE2D64DDBA7FE7D2FAE4CDD6B] + + + RegionNati + 129 + [RegionNati] + [2 Group outlines.shp] + RegionNati + 2 + string + Count + true + + [2 Group outlines.shp_99EEC23FE2D64DDBA7FE7D2FAE4CDD6B] + + + Geometry + 8 + [Geometry] + [2 Group outlines.shp] + Geometry + 3 + spatial + Collect + true + [2 Group outlines.shp_99EEC23FE2D64DDBA7FE7D2FAE4CDD6B] + + + Group + 129 + [Group (uk_group_population.csv)] + [uk_group_population.csv] + Group + 4 + string + Count + 1 + 1073741823 + true + + [uk_group_population.csv_351ECDD659DD4379A31F67AFC21AE5AD] + + + Population + 20 + [Population] + [uk_group_population.csv] + Population + 5 + integer + Sum + true + [uk_group_population.csv_351ECDD659DD4379A31F67AFC21AE5AD] + + + Label + 129 + [Label] + [uk_group_population.csv] + Label + 6 + string + Count + 1 + 1073741823 + true + + [uk_group_population.csv_351ECDD659DD4379A31F67AFC21AE5AD] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.054wmni0kuswrm10p9guf09s1ka5].[none:Group:nk] + [federated.054wmni0kuswrm10p9guf09s1ka5].[none:pcon-name:nk] + [federated.18kmj8g0nbq4nj108jil60nhvj7v].[none:Group (uk_group_population.csv):nk] + [federated.18kmj8g0nbq4nj108jil60nhvj7v].[sum:Population:qk] + [federated.1cdmrio0h0k6lq1buaesf0xtg6ml].[clct:Geometry:nk] + [federated.1cdmrio0h0k6lq1buaesf0xtg6ml].[none:CityLabel:nk] + [federated.1cdmrio0h0k6lq1buaesf0xtg6ml].[none:Group-labe:nk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[federated.18kmj8g0nbq4nj108jil60nhvj7v].[none:Group (uk_group_population.csv):nk]> + Æ + Total Population: + <[federated.18kmj8g0nbq4nj108jil60nhvj7v].[sum:Population:qk]> + + + + + + [federated.09day2w0kb7skl1fs2awr1az2gv9].[Latitude (generated)] + [federated.09day2w0kb7skl1fs2awr1az2gv9].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__choropleth__map-rates-or-ratios-by-region.tbm b/plugins/tableau/resources/templates/reference/spatial__choropleth__map-rates-or-ratios-by-region.tbm new file mode 100644 index 0000000..2816a11 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__choropleth__map-rates-or-ratios-by-region.tbm @@ -0,0 +1,4296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Country/Region:nk] + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:Country/Region:nk]> + Æ + Average Profit: + Æ + <[Sample - EU Superstore].[avg:Profit:qk]> + + + + + + [Sample - EU Superstore].[Latitude (generated)] + [Sample - EU Superstore].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__contour__show-equal-value-bands-across-geography.tbm b/plugins/tableau/resources/templates/reference/spatial__contour__show-equal-value-bands-across-geography.tbm new file mode 100644 index 0000000..3af60f2 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__contour__show-equal-value-bands-across-geography.tbm @@ -0,0 +1,348 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + ID + 129 + [ID] + [Extract] + ID + 0 + string + Count + 1330 + true + + [Extract (Extract.Extract)_8A319B668F6C4A118CE265664F2358B1] + + + FEAT_TYPE + 129 + [FEAT_TYPE] + [Extract] + FEAT_TYPE + 1 + string + Count + 2 + true + + [Extract (Extract.Extract)_8A319B668F6C4A118CE265664F2358B1] + + + SUB_TYPE + 129 + [SUB_TYPE] + [Extract] + SUB_TYPE + 2 + string + Count + 3 + true + + [Extract (Extract.Extract)_8A319B668F6C4A118CE265664F2358B1] + + + PROP_VALUE + 5 + [PROP_VALUE] + [Extract] + PROP_VALUE + 3 + real + Sum + 40 + true + [Extract (Extract.Extract)_8A319B668F6C4A118CE265664F2358B1] + + + SpatialObj + 128 + [SpatialObj] + [Extract] + SpatialObj + 4 + spatial + Collect + 1317 + true + [Extract (Extract.Extract)_8A319B668F6C4A118CE265664F2358B1] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1dac6fs09zddmk18appyy0imrhcl].[clct:SpatialObj:nk] + [federated.1dac6fs09zddmk18appyy0imrhcl].[none:ID:nk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1dac6fs09zddmk18appyy0imrhcl].[Latitude (generated)] + [federated.1dac6fs09zddmk18appyy0imrhcl].[Longitude (generated)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__density-map__show-intensity-hotspots-not-tied-to-admin-units.tbm b/plugins/tableau/resources/templates/reference/spatial__density-map__show-intensity-hotspots-not-tied-to-admin-units.tbm new file mode 100644 index 0000000..7e58b7f --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__density-map__show-intensity-hotspots-not-tied-to-admin-units.tbm @@ -0,0 +1,751 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [London Summer Crimes.csv] + + Count + true + + "UTF-8" + "en_GB" + "£" + "," + "true" + "en_GB" + "" + + + + Crime ID + 129 + [Crime ID] + [London Summer Crimes.csv] + Crime ID + 0 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Month + 129 + [Month] + [London Summer Crimes.csv] + Month + 1 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Reported by + 129 + [Reported by] + [London Summer Crimes.csv] + Reported by + 2 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Falls within + 129 + [Falls within] + [London Summer Crimes.csv] + Falls within + 3 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Longitude + 5 + [Longitude] + [London Summer Crimes.csv] + Longitude + 4 + real + Sum + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Latitude + 5 + [Latitude] + [London Summer Crimes.csv] + Latitude + 5 + real + Sum + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Location + 129 + [Location] + [London Summer Crimes.csv] + Location + 6 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + LSOA code + 129 + [LSOA code] + [London Summer Crimes.csv] + LSOA code + 7 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + LSOA name + 129 + [LSOA name] + [London Summer Crimes.csv] + LSOA name + 8 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Crime type + 129 + [Crime type] + [London Summer Crimes.csv] + Crime type + 9 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Last outcome category + 129 + [Last outcome category] + [London Summer Crimes.csv] + Last outcome category + 10 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Context + 129 + [Context] + [London Summer Crimes.csv] + Context + 11 + string + Count + 1 + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + NAME + 129 + [NAME] + [London_Borough_Excluding_MHW.shp] + NAME + 12 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + GSS_CODE + 129 + [GSS_CODE] + [London_Borough_Excluding_MHW.shp] + GSS_CODE + 13 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + HECTARES + 5 + [HECTARES] + [London_Borough_Excluding_MHW.shp] + HECTARES + 14 + real + Sum + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + NONLD_AREA + 5 + [NONLD_AREA] + [London_Borough_Excluding_MHW.shp] + NONLD_AREA + 15 + real + Sum + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + ONS_INNER + 129 + [ONS_INNER] + [London_Borough_Excluding_MHW.shp] + ONS_INNER + 16 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + SUB_2009 + 129 + [SUB_2009] + [London_Borough_Excluding_MHW.shp] + SUB_2009 + 17 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + SUB_2006 + 129 + [SUB_2006] + [London_Borough_Excluding_MHW.shp] + SUB_2006 + 18 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Geometry + 8 + [Geometry] + [London_Borough_Excluding_MHW.shp] + Geometry + 19 + spatial + Collect + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1jzs8720grz7zz1bdtv5w02zxx3y].[Latitude (generated)] + [federated.1jzs8720grz7zz1bdtv5w02zxx3y].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__dot-density__plot-individual-locations-or-events.tbm b/plugins/tableau/resources/templates/reference/spatial__dot-density__plot-individual-locations-or-events.tbm new file mode 100644 index 0000000..f4c7997 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__dot-density__plot-individual-locations-or-events.tbm @@ -0,0 +1,754 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [London Summer Crimes.csv] + + Count + true + + "UTF-8" + "en_GB" + "£" + "," + "true" + "en_GB" + "" + + + + Crime ID + 129 + [Crime ID] + [London Summer Crimes.csv] + Crime ID + 0 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Month + 129 + [Month] + [London Summer Crimes.csv] + Month + 1 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Reported by + 129 + [Reported by] + [London Summer Crimes.csv] + Reported by + 2 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Falls within + 129 + [Falls within] + [London Summer Crimes.csv] + Falls within + 3 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Longitude + 5 + [Longitude] + [London Summer Crimes.csv] + Longitude + 4 + real + Sum + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Latitude + 5 + [Latitude] + [London Summer Crimes.csv] + Latitude + 5 + real + Sum + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Location + 129 + [Location] + [London Summer Crimes.csv] + Location + 6 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + LSOA code + 129 + [LSOA code] + [London Summer Crimes.csv] + LSOA code + 7 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + LSOA name + 129 + [LSOA name] + [London Summer Crimes.csv] + LSOA name + 8 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Crime type + 129 + [Crime type] + [London Summer Crimes.csv] + Crime type + 9 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Last outcome category + 129 + [Last outcome category] + [London Summer Crimes.csv] + Last outcome category + 10 + string + Count + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Context + 129 + [Context] + [London Summer Crimes.csv] + Context + 11 + string + Count + 1 + 1 + 1073741823 + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + NAME + 129 + [NAME] + [London_Borough_Excluding_MHW.shp] + NAME + 12 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + GSS_CODE + 129 + [GSS_CODE] + [London_Borough_Excluding_MHW.shp] + GSS_CODE + 13 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + HECTARES + 5 + [HECTARES] + [London_Borough_Excluding_MHW.shp] + HECTARES + 14 + real + Sum + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + NONLD_AREA + 5 + [NONLD_AREA] + [London_Borough_Excluding_MHW.shp] + NONLD_AREA + 15 + real + Sum + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + ONS_INNER + 129 + [ONS_INNER] + [London_Borough_Excluding_MHW.shp] + ONS_INNER + 16 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + SUB_2009 + 129 + [SUB_2009] + [London_Borough_Excluding_MHW.shp] + SUB_2009 + 17 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + SUB_2006 + 129 + [SUB_2006] + [London_Borough_Excluding_MHW.shp] + SUB_2006 + 18 + string + Count + true + + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + Geometry + 8 + [Geometry] + [London_Borough_Excluding_MHW.shp] + Geometry + 19 + spatial + Collect + true + [London Summer Crimes.csv_1A139DDCBAE641B8B4A2C34FBA7FC9C4] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1jzs8720grz7zz1bdtv5w02zxx3y].[Latitude (generated)] + [federated.1jzs8720grz7zz1bdtv5w02zxx3y].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__equalized-cartogram__give-each-region-equal-shape-weight.tbm b/plugins/tableau/resources/templates/reference/spatial__equalized-cartogram__give-each-region-equal-shape-weight.tbm new file mode 100644 index 0000000..bcf8f63 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__equalized-cartogram__give-each-region-equal-shape-weight.tbm @@ -0,0 +1,438 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>Converting each unit on a map to a regular and equally-sized shape – good for representing voting regions with equal value.</run> + </formatted-text> + + + + + #080a10 + #141823 + #232937 + #373e4d + #4e5665 + #6a7180 + #898f9c + #adb2bb + #d3d6db + #e9eaed + #f6f7f8 + + + + + + + + + + + + + + + + + + + + + + + Borough + 129 + [Borough] + [LondonCrimes.shp] + Borough + 0 + string + Count + true + + [Migrated Data] + + + Crime_type + 129 + [Crime_type] + [LondonCrimes.shp] + Crime_type + 1 + string + Count + true + + [Migrated Data] + + + GridName + 129 + [GridName] + [LondonCrimes.shp] + GridName + 2 + string + Count + true + + [Migrated Data] + + + Date + 133 + [Date] + [LondonCrimes.shp] + Date + 3 + date + Year + true + [Migrated Data] + + + Crimes + 20 + [Crimes] + [LondonCrimes.shp] + Crimes + 4 + integer + Sum + true + [Migrated Data] + + + Geometry + 8 + [Geometry] + [LondonCrimes.shp] + Geometry + 5 + spatial + Collect + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + Borough + 129 + [Borough] + [Extract] + Borough + 0 + LondonCrimes.shp + string + Count + 32 + true + + [Migrated Data] + + + Crime_type + 129 + [Crime_type] + [Extract] + Crime_type + 1 + LondonCrimes.shp + string + Count + 1 + true + + [Migrated Data] + + + GridName + 129 + [GridName] + [Extract] + GridName + 2 + LondonCrimes.shp + string + Count + 108 + true + + [Migrated Data] + + + Date + 133 + [Date] + [Extract] + Date + 3 + LondonCrimes.shp + date + Year + 12 + true + [Migrated Data] + + + Crimes + 20 + [Crimes] + [Extract] + Crimes + 4 + LondonCrimes.shp + integer + Sum + 47 + true + [Migrated Data] + + + Geometry + 128 + [Geometry] + [Extract] + Geometry + 5 + LondonCrimes.shp + spatial + Collect + 1090 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[my:Date:ok] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[none:Borough:nk] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[none:Crime_type:nk] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[none:GridName:nk] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[yr:Date:ok] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[none:Crime_type:nk] + + + + + + + + + + + + + + + + + + + + <[federated.1cil50k16r0j6o1feqp6r0ey3ij7].[none:Borough:nk]> + Æ + Crimes: + <[federated.1cil50k16r0j6o1feqp6r0ey3ij7].[sum:Crimes:qk]> + + + + + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[Latitude (generated)] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__flow-map__show-movement-between-places.tbm b/plugins/tableau/resources/templates/reference/spatial__flow-map__show-movement-between-places.tbm new file mode 100644 index 0000000..d3b1211 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__flow-map__show-movement-between-places.tbm @@ -0,0 +1,668 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Airport ID + 20 + [Airport ID] + [Extract] + Airport ID + 0 + integer + Sum + 320 + true + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Origin Name + 129 + [Origin Name] + [Extract] + Origin Name + 1 + string + Count + 320 + true + + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Origin City + 129 + [Origin City] + [Extract] + Origin City + 2 + string + Count + 301 + true + + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Origin Country + 129 + [Origin Country] + [Extract] + Origin Country + 3 + string + Count + 1 + true + + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Origin Latitude + 5 + [Origin Latitude] + [Extract] + Origin Latitude + 4 + real + Sum + 320 + true + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Origin Longitude + 5 + [Origin Longitude] + [Extract] + Origin Longitude + 5 + real + Sum + 320 + true + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Origin Airport + 129 + [Origin Airport] + [Extract] + Origin Airport + 6 + string + Count + 320 + true + + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Origin Airport ID + 20 + [Origin Airport ID] + [Extract] + Origin Airport ID + 7 + integer + Sum + 320 + true + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Destination Airport + 129 + [Destination Airport] + [Extract] + Destination Airport + 8 + string + Count + 354 + true + + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Destination Airport ID + 20 + [Destination Airport ID] + [Extract] + Destination Airport ID + 9 + integer + Sum + 354 + true + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Destination Name + 129 + [Destination Name] + [Extract] + Destination Name + 10 + string + Count + 354 + true + + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Destination City + 129 + [Destination City] + [Extract] + Destination City + 11 + string + Count + 331 + true + + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Destination Country + 129 + [Destination Country] + [Extract] + Destination Country + 12 + string + Count + 1 + true + + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Destination Latitude + 5 + [Destination Latitude] + [Extract] + Destination Latitude + 13 + real + Sum + 354 + true + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Destination Longitude + 5 + [Destination Longitude] + [Extract] + Destination Longitude + 14 + real + Sum + 354 + true + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + Number of Airlines + 20 + [Number of Airlines] + [Extract] + Number of Airlines + 15 + integer + Sum + 13 + true + [Extract (Extract.Extract)_7AD6226B0EA14FE6A02C37B3B0F4A760] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.084sojc09l39kh1g4936b0eeh3j4].[none:Origin Airport:nk] + + + + + + + + + + + + + + + + + + + + + + + + + + <[federated.084sojc09l39kh1g4936b0eeh3j4].[attr:Origin Airport:nk]> + to + <[federated.084sojc09l39kh1g4936b0eeh3j4].[none:Destination Airport:nk]> + + + + + + + + + + + + + + + + + + Destination Airport: + <[federated.084sojc09l39kh1g4936b0eeh3j4].[attr:Destination Name:nk]> + + + + + + + + + + + + + + + + + Origin Airport: + <[federated.084sojc09l39kh1g4936b0eeh3j4].[attr:Origin Name:nk]> + + + + + + [federated.084sojc09l39kh1g4936b0eeh3j4].[Latitude (generated)] + [federated.084sojc09l39kh1g4936b0eeh3j4].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__grid-heatmap__map-intensity-on-a-grid-not-admin-boundaries.tbm b/plugins/tableau/resources/templates/reference/spatial__grid-heatmap__map-intensity-on-a-grid-not-admin-boundaries.tbm new file mode 100644 index 0000000..81aa904 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__grid-heatmap__map-intensity-on-a-grid-not-admin-boundaries.tbm @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>Grid-based data values mapped with an intensity colour scale. As choropleth map – but not snapped to an admin/political unit.</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + Tile_Num + 3 + [Tile_Num] + [Rats Sightings HeatMap.shp] + Tile_Num + 0 + integer + Sum + true + [Migrated Data] + + + Tile_Name + 129 + [Tile_Name] + [Rats Sightings HeatMap.shp] + Tile_Name + 1 + string + Count + true + + [Migrated Data] + + + Geometry + 8 + [Geometry] + [Rats Sightings HeatMap.shp] + Geometry + 2 + spatial + Collect + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + Tile_Num + 20 + [Tile_Num] + [Extract] + Tile_Num + 0 + Rats Sightings HeatMap.shp + integer + Sum + 5 + true + [Migrated Data] + + + Tile_Name + 129 + [Tile_Name] + [Extract] + Tile_Name + 1 + Rats Sightings HeatMap.shp + string + Count + 5 + true + + [Migrated Data] + + + Geometry + 128 + [Geometry] + [Extract] + Geometry + 2 + Rats Sightings HeatMap.shp + spatial + Collect + 5 + true + [Migrated Data] + + + + + + + + + + + + + "Extremely Low (Below 0.01975)" + "Low (0.01975 to 0.455)" + "Below Average (0.455 to 10.5)" + "Average (10.5 to 242.5)" + "Above Average (242.5 to 5600)" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.076gplu1ir2fb11aymn51116xv34].[none:DM:qk] + [federated.1a5qkzd06a8nie14hjbdp12e6af9].[none:Tile_Name:nk] + [federated.1a5qkzd06a8nie14hjbdp12e6af9].[none:Tile_Num:qk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DM: + + + + + [federated.1a5qkzd06a8nie14hjbdp12e6af9].[Latitude (generated)] + [federated.1a5qkzd06a8nie14hjbdp12e6af9].[Longitude (generated)] + +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__hexbin-map__aggregate-geography-into-equal-hex-cells.tbm b/plugins/tableau/resources/templates/reference/spatial__hexbin-map__aggregate-geography-into-equal-hex-cells.tbm new file mode 100644 index 0000000..cff1285 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__hexbin-map__aggregate-geography-into-equal-hex-cells.tbm @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:D52:no:A1:D52:0" + true + 2 + + + + Row + 20 + [Row] + [Sheet1] + Row + 0 + integer + Sum + true + + "I8" + + [Sheet1_D304C8E64E134E52873128353DEF5DDF] + + + Column + 5 + [Column] + [Sheet1] + Column + 1 + real + Sum + 15 + true + + "R8" + + [Sheet1_D304C8E64E134E52873128353DEF5DDF] + + + State + 130 + [State] + [Sheet1] + State + 2 + string + Count + true + + + "WSTR" + + [Sheet1_D304C8E64E134E52873128353DEF5DDF] + + + Abbreviation + 130 + [Abbreviation] + [Sheet1] + Abbreviation + 3 + string + Count + true + + + "WSTR" + + [Sheet1_D304C8E64E134E52873128353DEF5DDF] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0arjs141tl66p81casjzd0kqj3kp].[none:Abbreviation:nk] + [federated.0arjs141tl66p81casjzd0kqj3kp].[none:Calculation_0070936444309504:ok] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + < + [federated.0arjs141tl66p81casjzd0kqj3kp].[none:Abbreviation:nk] + > + + + + + + [federated.0arjs141tl66p81casjzd0kqj3kp].[none:Row:qk] + [federated.0arjs141tl66p81casjzd0kqj3kp].[none:Column:qk] + +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__proportional-symbol-map__map-totals-with-sized-marks-not-rates.tbm b/plugins/tableau/resources/templates/reference/spatial__proportional-symbol-map__map-totals-with-sized-marks-not-rates.tbm new file mode 100644 index 0000000..17d880e --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__proportional-symbol-map__map-totals-with-sized-marks-not-rates.tbm @@ -0,0 +1,1152 @@ + + + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>Use for totals rather than rates – be wary that small differences in data will be hard to see.</run> + </formatted-text> + + + + + #080a10 + #141823 + #232937 + #373e4d + #4e5665 + #6a7180 + #898f9c + #adb2bb + #d3d6db + #e9eaed + #f6f7f8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Address Type + 130 + [Address Type] + [Rat_Sightings] + Address Type + 0 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Agency Name + 130 + [Agency Name] + [Rat_Sightings] + Agency Name + 1 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Agency + 130 + [Agency] + [Rat_Sightings] + Agency + 2 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Borough + 130 + [Borough] + [Rat_Sightings] + Borough + 3 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + City + 130 + [City] + [Rat_Sightings] + City + 4 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Closed Date + 7 + [Closed Date] + [Rat_Sightings] + Closed Date + 5 + datetime + Year + true + + "DATE" + + [Migrated Data] + + + Community Board + 130 + [Community Board] + [Rat_Sightings] + Community Board + 6 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Complaint Type + 130 + [Complaint Type] + [Rat_Sightings] + Complaint Type + 7 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Created Date + 7 + [Created Date] + [Rat_Sightings] + Created Date + 8 + datetime + Year + true + + "DATE" + + [Migrated Data] + + + Cross Street 1 + 130 + [Cross Street 1] + [Rat_Sightings] + Cross Street 1 + 9 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Cross Street 2 + 130 + [Cross Street 2] + [Rat_Sightings] + Cross Street 2 + 10 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Descriptor + 130 + [Descriptor] + [Rat_Sightings] + Descriptor + 11 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Due Date + 7 + [Due Date] + [Rat_Sightings] + Due Date + 12 + datetime + Year + true + + "DATE" + + [Migrated Data] + + + Facility Type + 130 + [Facility Type] + [Rat_Sightings] + Facility Type + 13 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Incident Address + 130 + [Incident Address] + [Rat_Sightings] + Incident Address + 14 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Incident Zip + 20 + [Incident Zip] + [Rat_Sightings] + Incident Zip + 15 + integer + Sum + true + + "I8" + + [Migrated Data] + + + Intersection Street 1 + 130 + [Intersection Street 1] + [Rat_Sightings] + Intersection Street 1 + 16 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Intersection Street 2 + 130 + [Intersection Street 2] + [Rat_Sightings] + Intersection Street 2 + 17 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Landmark + 130 + [Landmark] + [Rat_Sightings] + Landmark + 18 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Latitude + 5 + [Latitude] + [Rat_Sightings] + Latitude + 19 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Location Type + 130 + [Location Type] + [Rat_Sightings] + Location Type + 20 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Longitude + 5 + [Longitude] + [Rat_Sightings] + Longitude + 21 + real + Sum + 15 + true + + "R8" + + [Migrated Data] + + + Park Borough + 130 + [Park Borough] + [Rat_Sightings] + Park Borough + 22 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Park Facility Name + 130 + [Park Facility Name] + [Rat_Sightings] + Park Facility Name + 23 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Resolution Action Updated Date + 130 + [Resolution Action Updated Date] + [Rat_Sightings] + Resolution Action Updated Date + 24 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Status + 130 + [Status] + [Rat_Sightings] + Status + 25 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Street Name + 130 + [Street Name] + [Rat_Sightings] + Street Name + 26 + string + Count + true + + + "WSTR" + + [Migrated Data] + + + Unique Key + 20 + [Unique Key] + [Rat_Sightings] + Unique Key + 27 + integer + Sum + true + + "I8" + + [Migrated Data] + + + + 0 + [Rat_Sightings] + + Count + true + + 0 + "A1:AB10001:no:A1:AB10001:0" + true + 2 + + [Migrated Data] + + + + + + + + + + + + + + + + + [Borough] + [Incident Zip] + + + + + + + + + + + Address Type + 129 + [Address Type] + [Extract] + Address Type + 0 + Rat_Sightings + string + Count + 5 + true + + [Migrated Data] + + + Agency Name + 129 + [Agency Name] + [Extract] + Agency Name + 1 + Rat_Sightings + string + Count + 1 + true + + [Migrated Data] + + + Agency + 129 + [Agency] + [Extract] + Agency + 2 + Rat_Sightings + string + Count + 1 + true + + [Migrated Data] + + + Borough + 129 + [Borough] + [Extract] + Borough + 3 + Rat_Sightings + string + Count + 5 + true + + [Migrated Data] + + + City + 129 + [City] + [Extract] + City + 4 + Rat_Sightings + string + Count + 213 + true + + [Migrated Data] + + + Closed Date + 135 + [Closed Date] + [Extract] + Closed Date + 5 + Rat_Sightings + datetime + Year + 9101 + true + [Migrated Data] + + + Community Board + 129 + [Community Board] + [Extract] + Community Board + 6 + Rat_Sightings + string + Count + 91 + true + + [Migrated Data] + + + Complaint Type + 129 + [Complaint Type] + [Extract] + Complaint Type + 7 + Rat_Sightings + string + Count + 1 + true + + [Migrated Data] + + + Created Date + 135 + [Created Date] + [Extract] + Created Date + 8 + Rat_Sightings + datetime + Year + 12546 + true + [Migrated Data] + + + Cross Street 1 + 129 + [Cross Street 1] + [Extract] + Cross Street 1 + 9 + Rat_Sightings + string + Count + 4425 + true + + [Migrated Data] + + + Cross Street 2 + 129 + [Cross Street 2] + [Extract] + Cross Street 2 + 10 + Rat_Sightings + string + Count + 4709 + true + + [Migrated Data] + + + Descriptor + 129 + [Descriptor] + [Extract] + Descriptor + 11 + Rat_Sightings + string + Count + 1 + true + + [Migrated Data] + + + Due Date + 135 + [Due Date] + [Extract] + Due Date + 12 + Rat_Sightings + datetime + Year + 114507 + true + [Migrated Data] + + + Facility Type + 129 + [Facility Type] + [Extract] + Facility Type + 13 + Rat_Sightings + string + Count + 1 + true + + [Migrated Data] + + + Incident Address + 129 + [Incident Address] + [Extract] + Incident Address + 14 + Rat_Sightings + string + Count + 36088 + true + + [Migrated Data] + + + Incident Zip + 20 + [Incident Zip] + [Extract] + Incident Zip + 15 + Rat_Sightings + integer + Sum + 415 + true + [Migrated Data] + + + Intersection Street 1 + 129 + [Intersection Street 1] + [Extract] + Intersection Street 1 + 16 + Rat_Sightings + string + Count + 3115 + true + + [Migrated Data] + + + Intersection Street 2 + 129 + [Intersection Street 2] + [Extract] + Intersection Street 2 + 17 + Rat_Sightings + string + Count + 6372 + true + + [Migrated Data] + + + Landmark + 129 + [Landmark] + [Extract] + Landmark + 18 + Rat_Sightings + string + Count + 1 + true + + [Migrated Data] + + + Latitude + 5 + [Latitude] + [Extract] + Latitude + 19 + Rat_Sightings + real + Sum + 39387 + true + [Migrated Data] + + + Location Type + 129 + [Location Type] + [Extract] + Location Type + 20 + Rat_Sightings + string + Count + 53 + true + + [Migrated Data] + + + Longitude + 5 + [Longitude] + [Extract] + Longitude + 21 + Rat_Sightings + real + Sum + 39387 + true + [Migrated Data] + + + Park Borough + 129 + [Park Borough] + [Extract] + Park Borough + 22 + Rat_Sightings + string + Count + 5 + true + + [Migrated Data] + + + Park Facility Name + 129 + [Park Facility Name] + [Extract] + Park Facility Name + 23 + Rat_Sightings + string + Count + 1 + true + + [Migrated Data] + + + Resolution Action Updated Date + 129 + [Resolution Action Updated Date] + [Extract] + Resolution Action Updated Date + 24 + Rat_Sightings + string + Count + 16512 + true + + [Migrated Data] + + + Status + 129 + [Status] + [Extract] + Status + 25 + Rat_Sightings + string + Count + 3 + true + + [Migrated Data] + + + Street Name + 129 + [Street Name] + [Extract] + Street Name + 26 + Rat_Sightings + string + Count + 7744 + true + + [Migrated Data] + + + Unique Key + 20 + [Unique Key] + [Extract] + Unique Key + 27 + Rat_Sightings + integer + Sum + 114507 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.0v0o2ld10ici9p16hfr0a195sn24].[Latitude (generated)] + [federated.0v0o2ld10ici9p16hfr0a195sn24].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__scaled-cartogram__distort-geography-so-area-encodes-value.tbm b/plugins/tableau/resources/templates/reference/spatial__scaled-cartogram__distort-geography-so-area-encodes-value.tbm new file mode 100644 index 0000000..3b7d992 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__scaled-cartogram__distort-geography-so-area-encodes-value.tbm @@ -0,0 +1,435 @@ + + + + + + + + + + + + + + + + + + <formatted-text> + <run><Sheet Name> </run> + <run fontname='Tableau Light' fontsize='9'>Stretching and shrinking a map so that each area is sized according to a particular value.</run> + </formatted-text> + + + + + + + + + + + + + + + + + + + + + id + 129 + [id] + [france_population.shp] + id + 0 + string + Count + true + + [Migrated Data] + + + name + 129 + [name] + [france_population.shp] + name + 1 + string + Count + true + + [Migrated Data] + + + tilegramVa + 3 + [tilegramVa] + [france_population.shp] + tilegramVa + 2 + integer + Sum + true + [Migrated Data] + + + Geometry + 8 + [Geometry] + [france_population.shp] + Geometry + 3 + spatial + Collect + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + id + 129 + [id] + [Extract] + id + 0 + france_population.shp + string + Count + 13 + true + + [Migrated Data] + + + name + 129 + [name] + [Extract] + name + 1 + france_population.shp + string + Count + 13 + true + + [Migrated Data] + + + tilegramVa + 20 + [tilegramVa] + [Extract] + tilegramVa + 2 + france_population.shp + integer + Sum + 13 + true + [Migrated Data] + + + Geometry + 128 + [Geometry] + [Extract] + Geometry + 3 + france_population.shp + spatial + Collect + 13 + true + [Migrated Data] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Country:nk] + [Sample - EU Superstore].[sum:Sales:qk] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[my:Date:ok] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[none:Borough:nk] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[none:Crime_type:nk] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[none:GridName:nk] + [federated.1cil50k16r0j6o1feqp6r0ey3ij7].[yr:Date:ok] + [federated.1xrkpt21i8djik111hfxv1st3v4d].[none:id:nk] + [federated.1xrkpt21i8djik111hfxv1st3v4d].[none:name:nk] + [federated.1xrkpt21i8djik111hfxv1st3v4d].[usr:Calculation_5073656843848998948:qk:2] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <[federated.1xrkpt21i8djik111hfxv1st3v4d].[none:name:nk]> + Æ + Population: + <[federated.1xrkpt21i8djik111hfxv1st3v4d].[sum:tilegramVa:qk]> + + + + + + [federated.1xrkpt21i8djik111hfxv1st3v4d].[Latitude (generated)] + [federated.1xrkpt21i8djik111hfxv1st3v4d].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__spike-map__show-magnitude-at-locations-with-height.tbm b/plugins/tableau/resources/templates/reference/spatial__spike-map__show-magnitude-at-locations-with-height.tbm new file mode 100644 index 0000000..75d73d4 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__spike-map__show-magnitude-at-locations-with-height.tbm @@ -0,0 +1,1023 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Sheet1+] + + Count + true + + + + 0 + [Sheet12] + + Count + true + + 0 + "A1:S191:no:A1:S191:0" + true + 2 + + + + Entity + 130 + [Entity] + [Sheet1+] + Entity + 0 + string + Count + true + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + Code + 130 + [Code] + [Sheet1+] + Code + 1 + string + Count + true + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + Year + 130 + [Year] + [Sheet1+] + Year + 2 + string + Count + true + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + Gender Inequality Index + 5 + [Gender Inequality Index] + [Sheet1+] + Gender Inequality Index + 3 + real + Sum + true + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + Sheet + 129 + [Sheet] + [Sheet1+] + Sheet + 4 + string + Count + true + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + Table Name + 129 + [Table Name] + [Sheet1+] + Table Name + 5 + string + Count + true + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + 1 + 20 + [1] + [Sheet12] + 1 + 6 + integer + Sum + true + + "I8" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + name + 130 + [name] + [Sheet12] + name + 7 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + alpha-2 + 130 + [alpha-2] + [Sheet12] + alpha-2 + 8 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + alpha-3 + 130 + [alpha-3] + [Sheet12] + alpha-3 + 9 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + country-code + 130 + [country-code] + [Sheet12] + country-code + 10 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + iso_3166-2 + 130 + [iso_3166-2] + [Sheet12] + iso_3166-2 + 11 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + region + 130 + [region] + [Sheet12] + region + 12 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + sub-region + 130 + [sub-region] + [Sheet12] + sub-region + 13 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + intermediate-region + 130 + [intermediate-region] + [Sheet12] + intermediate-region + 14 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + region-code + 130 + [region-code] + [Sheet12] + region-code + 15 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + sub-region-code + 130 + [sub-region-code] + [Sheet12] + sub-region-code + 16 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + intermediate-region-code + 130 + [intermediate-region-code] + [Sheet12] + intermediate-region-code + 17 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + country code + 130 + [country code] + [Sheet12] + country code + 18 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + Latitude + 5 + [Latitude] + [Sheet12] + Latitude + 19 + real + Sum + 15 + true + + "R8" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + Longitude + 5 + [Longitude] + [Sheet12] + Longitude + 20 + real + Sum + 15 + true + + "R8" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + Country Name + 130 + [Country Name] + [Sheet12] + Country Name + 21 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + coordinates_0 + 130 + [coordinates_0] + [Sheet12] + coordinates_0 + 22 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + coordinates_1 + 130 + [coordinates_1] + [Sheet12] + coordinates_1 + 23 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + country_code + 130 + [country_code] + [Sheet12] + country_code + 24 + string + Count + true + + + "WSTR" + + [Sheet1_0377C3D97A1B40318670C951F650A809] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[avg:Gender Inequality Index:qk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:Code:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:Country Name:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:Entity:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:Gender Inequality Index:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:Table Name:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:alpha-2:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:country-code:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:name:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:region:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:sub-region:nk] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:region:nk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:sub-region:nk] + + + + + + + + + + + + + + + + + + + + + + + <[federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:Country Name:nk]> + Æ + + + + + + + + + + + + + + + + + + + + <[federated.1c4k6r40hod0qv1b98nix0a4vlle].[attr:name:nk]> + Æ + Gender Inequality Index: + <[federated.1c4k6r40hod0qv1b98nix0a4vlle].[avg:Gender Inequality Index:qk]> + + + + + + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:Calculation_0070936784482313:qk] + [federated.1c4k6r40hod0qv1b98nix0a4vlle].[none:Longitude:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/spatial__symbol-map__place-sized-marks-at-coordinates.tbm b/plugins/tableau/resources/templates/reference/spatial__symbol-map__place-sized-marks-at-coordinates.tbm new file mode 100644 index 0000000..de2ad65 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/spatial__symbol-map__place-sized-marks-at-coordinates.tbm @@ -0,0 +1,4274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + [Orders] + + Count + true + + 0 + "A1:U10195:no:A1:U10195:0" + true + 2 + + + + + 0 + [Sheet1] + + Count + true + + 0 + "A1:B201:no:A1:B201:0" + true + 6 + + + + Row ID + 20 + [Row ID] + [Orders] + Row ID + 0 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order ID + 130 + [Order ID] + [Orders] + Order ID + 1 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Order Date + 7 + [Order Date] + [Orders] + Order Date + 2 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Dispatch Date + 7 + [Dispatch Date] + [Orders] + Dispatch Date + 3 + date + Year + true + + "DATE" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Delivery Mode + 130 + [Delivery Mode] + [Orders] + Delivery Mode + 4 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer ID + 130 + [Customer ID] + [Orders] + Customer ID + 5 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Customer Name + 130 + [Customer Name] + [Orders] + Customer Name + 6 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Segment + 130 + [Segment] + [Orders] + Segment + 7 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + City + 130 + [City] + [Orders] + City + 8 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + State/Province + 130 + [State/Province] + [Orders] + State/Province + 9 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Country/Region + 130 + [Country/Region] + [Orders] + Country/Region + 10 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Region + 130 + [Region] + [Orders] + Region + 11 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product ID + 130 + [Product ID] + [Orders] + Product ID + 12 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Category + 130 + [Category] + [Orders] + Category + 13 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sub-Category + 130 + [Sub-Category] + [Orders] + Sub-Category + 14 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Product Name + 130 + [Product Name] + [Orders] + Product Name + 15 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Sales + 5 + [Sales] + [Orders] + Sales + 16 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Quantity + 20 + [Quantity] + [Orders] + Quantity + 17 + integer + Sum + true + + "I8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Discount + 5 + [Discount] + [Orders] + Discount + 18 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Profit + 5 + [Profit] + [Orders] + Profit + 19 + real + Sum + 15 + true + + "R8" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Postcode + 130 + [Postcode] + [Orders] + Postcode + 20 + string + Count + true + + + "WSTR" + + [Orders_ECFCA1FB690A41FE803BC071773BA862] + + + Range + 20 + [Range] + [Sheet1] + Range + 21 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + X + 20 + [X] + [Sheet1] + X + 22 + integer + Sum + true + + "I8" + + [Sheet1_F37365A782B541658041CC3614B2B70E] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - EU Superstore].[none:Country/Region:nk] + + + + + + + + + + + + + + + + + + + <[Sample - EU Superstore].[none:State/Province:nk]>, <[Sample - EU Superstore].[none:Country/Region:nk]> + Æ + Total Sales: + <[Sample - EU Superstore].[sum:Sales:qk]> + + + + + + [Sample - EU Superstore].[Latitude (generated)] + [Sample - EU Superstore].[Longitude (generated)] +
+
diff --git a/plugins/tableau/resources/templates/reference/trend-line-chart.tbm b/plugins/tableau/resources/templates/reference/trend-line-chart.tbm new file mode 100644 index 0000000..ce8ffdd --- /dev/null +++ b/plugins/tableau/resources/templates/reference/trend-line-chart.tbm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[sum:Profit:qk] + [Sample - Superstore].[tmn:Order Date:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/ww-floating-bars.tbm b/plugins/tableau/resources/templates/reference/ww-floating-bars.tbm new file mode 100644 index 0000000..8dc634f --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ww-floating-bars.tbm @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[none:Customer Name:nk] + [Sample - Superstore].[min:Profit:qk] +
+
diff --git a/plugins/tableau/resources/templates/reference/ww-ou-arrow.tbm b/plugins/tableau/resources/templates/reference/ww-ou-arrow.tbm new file mode 100644 index 0000000..0f48a39 --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ww-ou-arrow.tbm @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[:Measure Names] + [Sample - Superstore].[none:Super Bowl - Split 2:ok] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ([Sample - Superstore].[none:Super Bowl - Split 2:ok] / ([Sample - Superstore].[none:Calculation_3985421141106695:nk] / [Sample - Superstore].[sum:Profit:ok])) + ([Sample - Superstore].[Multiple Values] + ([Sample - Superstore].[sum:Calculation_3985421010944000:qk] + ([Sample - Superstore].[sum:Over/Under Binary (copy)_3985421014155269:qk] + [Sample - Superstore].[sum:Over/Under Binary (copy)_3985421014155269:qk]))) +
+
diff --git a/plugins/tableau/resources/templates/reference/ww-ou-diff.tbm b/plugins/tableau/resources/templates/reference/ww-ou-diff.tbm new file mode 100644 index 0000000..7d8d3cb --- /dev/null +++ b/plugins/tableau/resources/templates/reference/ww-ou-diff.tbm @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + [Sample - Superstore].[:Measure Names] + [Sample - Superstore].[none:Super Bowl - Split 2:ok] + + + + + + + + + + + + + + + + + + + + + + + + + ([Sample - Superstore].[none:Super Bowl - Split 2:ok] / ([Sample - Superstore].[none:Calculation_3985421141106695:nk] / [Sample - Superstore].[sum:Profit:ok])) + ([Sample - Superstore].[sum:Over/Under Binary (copy)_3985421014155269:qk] + [Sample - Superstore].[sum:Over/Under Binary (copy)_3985421014155269:qk]) +
+
diff --git a/plugins/tableau/scripts/generate_resource_catalog.py b/plugins/tableau/scripts/generate_resource_catalog.py new file mode 100644 index 0000000..1b0475f --- /dev/null +++ b/plugins/tableau/scripts/generate_resource_catalog.py @@ -0,0 +1,686 @@ +#!/usr/bin/env python3 +"""Deterministic resource catalog generator for the Tableau plugin. + +Scans every resource under ``resources/`` (bookmark templates, examples, +references, and starters), classifies each ``.tbm`` bookmark as +``executable`` or ``reference`` based on static portability checks, and +produces a single deterministic ``resources/catalog.json``. +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import re +import shutil +import sys +from pathlib import Path +from xml.etree import ElementTree as ET + +BLOCKERS = { + "multiple-datasources", + "inline-datasource", + "connection-dependency", + "viz-extension", + "missing-column-metadata", + "unresolved-field-reference", + "external-calculation-dependency", + "invalid-bookmark-shape", +} + +# Tableau pseudo-fields that never resolve to a column or column-instance. +PSEUDO_FIELDS = {":Measure Names", "Multiple Values", "Multiple Names"} + +# Tableau pseudo-datasource names that are never real, rewritable donors. +# "Parameters" is the workbook-level parameter pseudo-datasource; internal +# object IDs are hidden per-table row-count namespaces inside inline +# relational datasources. Both show up as the first bracket segment of a +# "[Name].[Field]" reference but must not count toward donor-datasource +# discovery or the multiple-datasources blocker. +PSEUDO_DATASOURCE_NAMES = {"Parameters", "__tableau_internal_object_id__"} + +# Attributes/tags that may carry a "[Datasource].[Field]" qualified reference +# anywhere in the document. Used only to discover donor datasource names, so +# false positives (e.g. a field placed only in a tooltip) are harmless here. +_BROAD_REF_ATTRS = ( + "column", + "axis-column", + "value-column", + "dimension-to-sort", + "measure-to-sort-by", + "using", + "param", + "field", + "y-axis-name", + "x-axis-name", + "ordering-field", +) +_BROAD_REF_TEXT_TAGS = ("rows", "cols", "field") + +QUALIFIED_REF_RE = re.compile(r"\[([^\[\]]+)\]\.\[([^\[\]]+)\]") +PARAMETER_RE = re.compile(r"\{\{([A-Za-z0-9_]+)\}\}") +FIELD_BASE_RE = re.compile(r"^field_base_\d+$") + +TEMPLATE_TIERS = ("unclassified", "executable", "reference") + +# Parameter types a reviewed contract may declare. Every explicit +# {{PARAMETER}} token must map to one of these in the generated catalog. +PARAMETER_TYPES = frozenset({"date", "enum", "number", "string"}) + +PLAIN_RESOURCE_DIRS = { + "examples": "example", + "references": "reference", + "starters": "starter", +} + + +def sha256(path: Path) -> str: + """Return the hex sha256 digest of a file's raw bytes.""" + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def strip_brackets(value: str) -> str: + """Strip a single pair of surrounding square brackets, if present.""" + value = value.strip() + if value.startswith("[") and value.endswith("]") and len(value) >= 2: + return value[1:-1] + return value + + +def extract_parameters(text: str) -> list[str]: + """Return sorted, unique explicit ``{{PARAMETER}}`` names in ``text``. + + ``{{DATASOURCE}}`` and ``{{field_base_N}}`` are template-substitution + tokens, not caller-supplied parameters, and are excluded. + """ + names: set[str] = set() + for token in PARAMETER_RE.findall(text): + if token == "DATASOURCE": + continue + if FIELD_BASE_RE.match(token): + continue + if token != token.upper(): + continue + names.add(token) + return sorted(names) + + +def _broad_qualified_refs(root: ET.Element) -> list[tuple[str, str]]: + """Find every ``[Datasource].[Field]`` reference anywhere in the tree. + + Deliberately permissive: used only to discover donor datasource names, + never to decide whether a specific field is "placed" on the view. + """ + refs: list[tuple[str, str]] = [] + for element in root.iter(): + for attr in _BROAD_REF_ATTRS: + value = element.get(attr) + if value: + refs.extend(QUALIFIED_REF_RE.findall(value)) + if element.tag in _BROAD_REF_TEXT_TAGS and element.text: + refs.extend(QUALIFIED_REF_RE.findall(element.text)) + if element.tag == "groupfilter": + member = element.get("member") + if member: + refs.extend(QUALIFIED_REF_RE.findall(member.strip('"'))) + return refs + + +def _strict_placed_refs( + root: ET.Element, table: ET.Element +) -> list[tuple[str, str, str]]: + """Find field references actually placed on the view. + + Restricted to rows, columns, marks encodings, filters (including slices + and group-filter members), titles, and reference lines, per the resource + catalog design's executable-eligibility rules. + """ + refs: list[tuple[str, str, str]] = [] + + rows_text = table.findtext("rows") + if rows_text: + refs.extend( + (ds, field, "rows") for ds, field in QUALIFIED_REF_RE.findall(rows_text) + ) + cols_text = table.findtext("cols") + if cols_text: + refs.extend( + (ds, field, "columns") for ds, field in QUALIFIED_REF_RE.findall(cols_text) + ) + + for encodings in table.iter("encodings"): + for encoding in encodings: + value = encoding.get("column") + if value: + refs.extend( + (ds, field, "marks") for ds, field in QUALIFIED_REF_RE.findall(value) + ) + + for filt in table.iter("filter"): + value = filt.get("column") + if value: + refs.extend( + (ds, field, "filters") for ds, field in QUALIFIED_REF_RE.findall(value) + ) + for group_filter in table.iter("groupfilter"): + member = group_filter.get("member") + if member: + refs.extend( + (ds, field, "filters") + for ds, field in QUALIFIED_REF_RE.findall(member.strip('"')) + ) + for slices in table.iter("slices"): + for column in slices.findall("column"): + if column.text: + refs.extend( + (ds, field, "filters") + for ds, field in QUALIFIED_REF_RE.findall(column.text) + ) + + for reference_line in table.iter("reference-line"): + for attr in ("axis-column", "value-column"): + value = reference_line.get(attr) + if value: + refs.extend( + (ds, field, "reference-line") + for ds, field in QUALIFIED_REF_RE.findall(value) + ) + + layout_options = root.find("layout-options") + if layout_options is not None: + title = layout_options.find("title") + if title is not None: + for field_element in title.iter("field"): + if field_element.text: + refs.extend( + (ds, field, "title") + for ds, field in QUALIFIED_REF_RE.findall(field_element.text) + ) + + return refs + + +def extract_bookmark(path: Path) -> dict[str, object]: + """Parse a ``.tbm`` bookmark and extract its classification-relevant facts.""" + text = path.read_text(encoding="utf-8") + + try: + root = ET.fromstring(text) + except ET.ParseError: + return { + "datasources": [], + "fields": [], + "parameters": [], + "blockers": ["invalid-bookmark-shape"], + } + + blockers: set[str] = set() + + windows = root.findall("window") + tables = root.findall("table") + if len(windows) != 1 or len(tables) != 1: + blockers.add("invalid-bookmark-shape") + table = tables[0] if tables else None + + datasource_elements = list(root.iter("datasource")) + datasource_names: set[str] = { + ds.get("name") + for ds in datasource_elements + if ds.get("name") and ds.get("name") not in PSEUDO_DATASOURCE_NAMES + } + if any(ds.get("inline") == "true" for ds in datasource_elements): + blockers.add("inline-datasource") + + for dependencies in root.iter("datasource-dependencies"): + name = dependencies.get("datasource") + if name and name not in PSEUDO_DATASOURCE_NAMES: + datasource_names.add(name) + + for ds_name, _field in _broad_qualified_refs(root): + if ds_name not in PSEUDO_DATASOURCE_NAMES: + datasource_names.add(ds_name) + + connection_dependency = False + for ds in datasource_elements: + if ds.get("inline") == "true": + continue + name = ds.get("name") or "" + if name in PSEUDO_DATASOURCE_NAMES: + continue + if name.startswith("federated.") or ds.find("connection") is not None: + connection_dependency = True + if connection_dependency: + blockers.add("connection-dependency") + + if len(datasource_names) > 1: + blockers.add("multiple-datasources") + + viz_extension = any( + mark.get("class") == "VizExtension" for mark in root.iter("mark") + ) + if root.find(".//add-in") is not None: + viz_extension = True + if viz_extension: + blockers.add("viz-extension") + + columns: dict[str, ET.Element] = {} + instances: dict[str, ET.Element] = {} + for dependencies in root.iter("datasource-dependencies"): + for column in dependencies.findall("column"): + name = column.get("name") + if name: + columns[name] = column + for instance in dependencies.findall("column-instance"): + name = instance.get("name") + if name: + instances[name] = instance + + if any(column.find("calculation") is not None for column in columns.values()): + blockers.add("external-calculation-dependency") + + placed_refs = _strict_placed_refs(root, table) if table is not None else [] + + fields: list[dict[str, object]] = [] + seen_field_keys: set[tuple[str, str, str, str | None]] = set() + unresolved: list[str] = [] + missing_metadata: list[str] = [] + + for ds_name, field_name, shelf in placed_refs: + if field_name in PSEUDO_FIELDS: + continue + bracketed = f"[{field_name}]" + + if bracketed in instances: + instance = instances[bracketed] + base_name = instance.get("column") + base_column = columns.get(base_name) if base_name else None + if base_column is None: + missing_metadata.append(bracketed) + continue + derivation = instance.get("derivation") + elif bracketed in columns: + base_column = columns[bracketed] + base_name = bracketed + derivation = None + else: + unresolved.append(bracketed) + continue + + source_field = strip_brackets(base_name) + # Include derivation in the dedup key: two column-instances on the + # same shelf can derive the same base field differently (e.g. Sum vs + # Avg), and both are distinct, real placements worth keeping. + key = (ds_name, source_field, shelf, derivation) + if key in seen_field_keys: + continue + seen_field_keys.add(key) + fields.append( + { + "sourceField": source_field, + "datasource": ds_name, + "datatype": base_column.get("datatype"), + "role": base_column.get("role"), + "derivation": derivation, + "shelf": shelf, + } + ) + + if unresolved: + blockers.add("unresolved-field-reference") + if missing_metadata: + blockers.add("missing-column-metadata") + + fields.sort( + key=lambda item: ( + item["sourceField"], + item["shelf"], + item["datasource"], + item["derivation"] or "", + ) + ) + + return { + "datasources": sorted(datasource_names), + "fields": fields, + "parameters": extract_parameters(text), + "blockers": sorted(blockers), + } + + +def classify_bookmark(metadata: dict[str, object]) -> tuple[str, list[str]]: + """Classify a bookmark as ``executable`` or ``reference``. + + Any recorded blocker forces ``reference`` with stable, sorted reason IDs. + """ + reasons = sorted(metadata.get("blockers", [])) + tier = "reference" if reasons else "executable" + return tier, reasons + + +def _infer_family_and_intent(resource_id: str) -> tuple[str | None, str | None]: + """Derive a family/intent guess from a resource's filename. + + File names provide discovery keywords and intent, never runtime field + semantics; explicit catalog overrides take precedence over this guess. + """ + if "__" in resource_id: + parts = resource_id.split("__") + family = parts[0] + intent = parts[-1].replace("-", " ").replace("_", " ").strip() + return family, intent or None + intent = resource_id.replace("-", " ").replace("_", " ").strip() + return None, intent or None + + +def _keywords(resource_id: str, extra: tuple[str, ...] = ()) -> list[str]: + tokens = {token for token in re.split(r"[-_]+", resource_id.lower()) if token} + tokens.update(extra) + return sorted(tokens) + + +def _relative_path(path: Path, resources_dir: Path) -> str: + relative = path.resolve().relative_to(resources_dir.resolve()) + return "./" + relative.as_posix() + + +def _load_overrides(resources_dir: Path) -> dict[str, dict[str, object]]: + overrides_path = resources_dir / "catalog-overrides.json" + if not overrides_path.exists(): + return {} + data = json.loads(overrides_path.read_text(encoding="utf-8")) + return data.get("resources", {}) + + +def _parameter_contracts( + resource_id: str, override: dict[str, object], metadata: dict[str, object] +) -> list[dict[str, object]]: + """Build one complete typed contract per inferred ``{{PARAMETER}}`` token. + + Parameter types are reviewed in ``catalog-overrides.json`` but are copied + into the generated catalog so runtime validation never depends on the + overrides file being present or readable. Generation fails when a token + has no reviewed contract, when a contract names an unknown token, or when + a type is missing or unrecognized, so an untyped parameter can never reach + the catalog and be validated loosely later. + + Overrides still never remove a blocker or promote a failed resource to + executable. + """ + declared = override.get("parameters") + declared = {} if declared is None else declared + inferred = set(metadata["parameters"]) + if set(declared) != inferred: + raise ValueError( + f"catalog override parameters for {resource_id!r} do not match " + f"inferred parameters: declared={sorted(declared)} " + f"inferred={sorted(inferred)}" + ) + + contracts: list[dict[str, object]] = [] + for name in sorted(inferred): + spec = declared[name] or {} + kind = spec.get("type") + if kind not in PARAMETER_TYPES: + raise ValueError( + f"catalog override parameter {name!r} for {resource_id!r} must " + f"declare a type from {', '.join(sorted(PARAMETER_TYPES))}, " + f"got: {kind!r}" + ) + contract: dict[str, object] = { + "name": name, + "type": kind, + "required": bool(spec.get("required", True)), + } + if kind == "enum": + allowed = [str(value) for value in spec.get("allowed") or []] + if not allowed: + raise ValueError( + f"catalog override parameter {name!r} for {resource_id!r} is " + "an enum and must declare a non-empty 'allowed' list" + ) + contract["allowed"] = allowed + contracts.append(contract) + return contracts + + +def _iter_template_files(resources_dir: Path) -> list[Path]: + templates_root = resources_dir / "templates" + seen: dict[str, Path] = {} + files: list[Path] = [] + for tier in TEMPLATE_TIERS: + tier_dir = templates_root / tier + if not tier_dir.exists(): + continue + for path in sorted(tier_dir.glob("*.tbm")): + # pathlib's glob (unlike shell globbing) matches dotfiles too; + # skip them explicitly so stray hidden files never become + # catalog entries or get moved between tiers. + if path.name.startswith("."): + continue + if path.name in seen: + raise ValueError( + f"duplicate template filename across tiers: {path.name} " + f"found at both {seen[path.name]} and {path}" + ) + seen[path.name] = path + files.append(path) + return files + + +def _iter_plain_resource_files(resources_dir: Path) -> list[Path]: + files: list[Path] = [] + for dirname in sorted(PLAIN_RESOURCE_DIRS): + directory = resources_dir / dirname + if not directory.exists(): + continue + for path in sorted(directory.iterdir()): + # Skip dotfiles (e.g. macOS ".DS_Store") and any stray cache + # directories; they are filesystem noise, not corpus resources. + if path.name.startswith("."): + continue + if path.is_file(): + files.append(path) + return files + + +def _build_template_entry( + path: Path, + resources_dir: Path, + overrides: dict[str, dict[str, object]], +) -> dict[str, object]: + resource_id = path.stem + metadata = extract_bookmark(path) + tier, reasons = classify_bookmark(metadata) + + override = overrides.get(resource_id, {}) + parameters = _parameter_contracts(resource_id, override, metadata) + + inferred_family, inferred_intent = _infer_family_and_intent(resource_id) + family = override.get("family", inferred_family) + intent = override.get("intent", inferred_intent) + + canonical_path = resources_dir / "templates" / tier / path.name + + return { + "id": resource_id, + "type": "template", + "family": family, + "intent": intent, + "path": _relative_path(canonical_path, resources_dir), + "tier": tier, + "classificationReasons": reasons, + "datasources": sorted(metadata["datasources"]), + "fields": metadata["fields"], + "parameters": parameters, + "keywords": _keywords(resource_id, extra=("template", tier)), + "sha256": sha256(path), + } + + +def _build_plain_entry(path: Path, resources_dir: Path) -> dict[str, object]: + resource_id = path.stem + resource_type = PLAIN_RESOURCE_DIRS.get(path.parent.name, path.parent.name) + family, intent = _infer_family_and_intent(resource_id) + + return { + "id": resource_id, + "type": resource_type, + "family": family, + "intent": intent, + "path": _relative_path(path, resources_dir), + "tier": "reference", + "classificationReasons": [], + "datasources": [], + "fields": [], + "parameters": [], + "keywords": _keywords(resource_id, extra=(resource_type,)), + "sha256": sha256(path), + } + + +def _validate_unique_ids(entries: list[dict[str, object]]) -> None: + """Raise a clear error if any resource id collides across resource kinds. + + Resource IDs are derived from filename stems independently per directory + (templates/unclassified|executable|reference, examples, references, + starters), so a stem shared across two directories (e.g. a template and + an example with the same name) would otherwise silently collide. + """ + seen: dict[str, str] = {} + for entry in entries: + resource_id = entry["id"] + if resource_id in seen: + raise ValueError( + f"duplicate resource id {resource_id!r}: " + f"{seen[resource_id]} and {entry['path']} both resolve to " + "the same catalog id" + ) + seen[resource_id] = entry["path"] + + +def generate_catalog(plugin_root: Path) -> dict[str, object]: + """Generate the full, deterministic resource catalog for a plugin root.""" + plugin_root = Path(plugin_root) + resources_dir = plugin_root / "resources" + overrides = _load_overrides(resources_dir) + + entries: list[dict[str, object]] = [] + for path in _iter_template_files(resources_dir): + entries.append(_build_template_entry(path, resources_dir, overrides)) + for path in _iter_plain_resource_files(resources_dir): + entries.append(_build_plain_entry(path, resources_dir)) + + entries.sort(key=lambda entry: entry["id"]) + _validate_unique_ids(entries) + + return { + "schemaVersion": 1, + "generatedFrom": { + "provenance": "./provenance.json", + "overrides": "./catalog-overrides.json", + }, + "resources": entries, + } + + +def _apply_moves(resources_dir: Path, catalog: dict[str, object]) -> None: + """Move each template into its canonical tier directory, preserving bytes.""" + templates_root = resources_dir / "templates" + for entry in catalog["resources"]: + if entry["type"] != "template": + continue + target = resources_dir / Path(entry["path"][2:]) + filename = target.name + current = None + for tier in TEMPLATE_TIERS: + candidate = templates_root / tier / filename + if candidate.exists(): + current = candidate + break + if current is None: + raise FileNotFoundError( + f"template file not found for resource {entry['id']!r}" + ) + if current != target: + target.parent.mkdir(parents=True, exist_ok=True) + shutil.move(str(current), str(target)) + + +def _detect_drift(resources_dir: Path, catalog: dict[str, object]) -> list[str]: + """Report templates whose physical location disagrees with the catalog.""" + problems: list[str] = [] + for entry in catalog["resources"]: + if entry["type"] != "template": + continue + target = resources_dir / Path(entry["path"][2:]) + if not target.exists(): + problems.append( + f"{entry['id']} expected at {entry['path']} but the file is " + "not there (run --write to move it)" + ) + return problems + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser( + description="Generate the deterministic Tableau resource catalog." + ) + parser.add_argument( + "--plugin-root", + type=Path, + required=True, + help="Path to the plugin root directory (containing resources/).", + ) + mode = parser.add_mutually_exclusive_group(required=True) + mode.add_argument( + "--write", + action="store_true", + help="Regenerate catalog.json and move templates into their tier.", + ) + mode.add_argument( + "--check", + action="store_true", + help="Verify catalog.json and template locations are up to date.", + ) + args = parser.parse_args(argv) + + plugin_root = Path(args.plugin_root) + resources_dir = plugin_root / "resources" + catalog_path = resources_dir / "catalog.json" + + try: + catalog = generate_catalog(plugin_root) + except ValueError as error: + # Raised for duplicate resource ids or override/parameter mismatches. + # Fail before any write or move happens in either mode. + print(f"error: {error}", file=sys.stderr) + return 1 + serialized = json.dumps(catalog, indent=2) + "\n" + + if args.write: + _apply_moves(resources_dir, catalog) + catalog_path.write_text(serialized, encoding="utf-8") + print(f"wrote {catalog_path} with {len(catalog['resources'])} resources") + return 0 + + errors: list[str] = [] + if not catalog_path.exists(): + errors.append(f"{catalog_path} does not exist") + else: + existing = catalog_path.read_text(encoding="utf-8") + if existing != serialized: + errors.append(f"{catalog_path} is stale relative to generated output") + errors.extend(_detect_drift(resources_dir, catalog)) + + if errors: + for message in errors: + print(f"error: {message}", file=sys.stderr) + return 1 + + print("catalog.json is up to date") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/plugins/tableau/scripts/tableau_resources.py b/plugins/tableau/scripts/tableau_resources.py new file mode 100755 index 0000000..b22cf55 --- /dev/null +++ b/plugins/tableau/scripts/tableau_resources.py @@ -0,0 +1,2396 @@ +#!/usr/bin/env python3 +"""Discovery, inspection, rendering, validation, and workbook transformation. + +Provides ``list`` and ``inspect`` commands against ``resources/catalog.json``, +:func:`render_bookmark`, which converts one executable ``.tbm`` bookmark into a +worksheet/window fragment pair against caller-supplied datasource, field, and +parameter mappings, the ``instantiate`` and ``inject`` commands, which put that +pair into a starter or an existing ``.twb``, and the ``validate`` command, +which reports a workbook's structural errors. + +Neither rendering nor injection guesses a mapping, and neither serializes a +donor bookmark or a caller's workbook through ``ElementTree``: both parse to +confirm structure and then perform bounded text splices so unrelated Tableau +XML survives byte-for-byte. A generated workbook is validated against the +input workbook's own validation result before it is written, so a run that +would introduce a new structural error leaves no output behind while a +workbook that arrived with errors can still be extended. +""" + +from __future__ import annotations + +import argparse +import datetime +import hashlib +import html +import json +import os +import re +import sys +import tempfile +import uuid +from pathlib import Path +from typing import NamedTuple +from xml.etree import ElementTree as ET +from xml.parsers import expat +from xml.sax.saxutils import escape as xml_escape + +TOKEN_RE = re.compile(r"[a-z0-9]+") + +# Bracketed Tableau identifiers escape a literal "]" by doubling it. +_BRACKET_CONTENT = r"(?:\]\]|[^\[\]])+" +QUALIFIED_REF_RE = re.compile( + rf"\[({_BRACKET_CONTENT})\]\.\[({_BRACKET_CONTENT})\]" +) +# Column-instance names encode "derivation:field:role", e.g. [sum:ARR:qk]. +DERIVED_SEGMENT_RE = re.compile(r"^([^:]+):(.+):([^:]+)$") +TEMPLATE_TOKEN_RE = re.compile(r"\{\{[^}]+\}\}") +# Tableau names a real workbook connection "federated.", so a rendered +# fragment legitimately carries the validated target's federated name. Any +# other federated token is donor residue or an unresolved placeholder. +FEDERATED_RE = re.compile(r"federated\.[\w.\-]*") +SIMPLE_ID_RE = re.compile(r"(]*?\buuid=)(['\"])[^'\"]*\2") +ATTRIBUTE_RE = re.compile(r"([\w:.\-]+)\s*=\s*(['\"])(.*?)\2", re.DOTALL) +NAMESPACE_DECLARATION_RE = re.compile( + r"xmlns(?::[\w.\-]+)?\s*=\s*(['\"]).*?\1", re.DOTALL +) + +# Tableau pseudo-fields and generated geographic fields are never donor +# columns, so they neither require nor accept a caller mapping. +PSEUDO_FIELD_NAMES = frozenset({"Multiple Values", "Multiple Names"}) +GENERATED_FIELD_RE = re.compile(r"^(Latitude|Longitude) \(generated\)$") + +# Attribute names whose value addresses the datasource: Tableau resolves them +# against the workbook's declared datasources, so one still holding the donor's +# name is genuine residue. +DATASOURCE_ADDRESS_ATTRIBUTES = ("name", "datasource") + +# Attribute names whose value is the datasource's own name rather than a +# reference into it. ``caption`` joins the addressing pair here because it too +# is rewritten when a fragment is retargeted, but it labels the datasource +# rather than addressing it. +DATASOURCE_NAME_ATTRIBUTES = DATASOURCE_ADDRESS_ATTRIBUTES + ("caption",) + +# Elements whose bracketed name attribute defines a field a view may reference. +FIELD_DEFINITION_TAGS = ("column", "column-instance", "group") + +# A connection's physical columns are declared as entries of +# this class; other classes describe the connection itself, not a field. +METADATA_RECORD_COLUMN_CLASS = "column" + +# Tableau datatypes grouped into the families this module treats as +# interchangeable. Within a family a template survives being repointed at +# another field: the derivation, the shelf role, and the mark type all remain +# valid, so only the declared type has to change. Across families it does not, +# so a cross-family mapping is refused rather than rendered. +DATATYPE_FAMILIES = { + "integer": "numeric", + "real": "numeric", + "date": "temporal", + "datetime": "temporal", + "string": "string", + "boolean": "boolean", + "spatial": "spatial", +} +NUMERIC_FAMILY = "numeric" + +# Declared metadata of a mapped target field, rewritten onto the rendered +# dependency declaration so it describes the field it now names. +DEPENDENCY_METADATA_ATTRIBUTES = ("datatype", "user-datatype", "role") + +# Tableau types a geographic role and a field reference identically, as +# QualifiedName-ST, so both are written "[a].[b]". These name a role in the +# geocoding hierarchy — semantic-role='[State].[Name]' on a column, and a +# geocoding default — and neither +# names a datasource. Field definitions are listed here too because their own +# attributes describe the field rather than pointing at another one. +NON_REFERENCE_TAGS = frozenset(FIELD_DEFINITION_TAGS) | {"semantic-value"} +NON_REFERENCE_ATTRIBUTES = frozenset({"semantic-role"}) + +# Containers whose contents reference datasource fields. Physical relation +# metadata inside uses the same "[name].[name]" shape to name a +# table's column, so it is deliberately outside the reference scan. +FIELD_REFERENCE_CONTAINERS = ("worksheets", "dashboards", "windows") + +# Containers a Tableau workbook must declare for a fragment to have anywhere +# to land, in the order they are reported. +REQUIRED_CONTAINERS = ("datasources", "worksheets", "windows") + +# Donor-only provenance metadata: attributes that name a donor column without +# qualifying it with the datasource, so qualified-reference discovery cannot +# see them. They record where a column's aggregate role came from rather than +# taking part in the viz definition, so an unmapped one is dropped. +DONOR_METADATA_ATTRIBUTES = (("column", "aggregate-role-from"),) + +# Parameter types a generated contract may declare. A declared token with any +# other type has no usable contract and is rejected rather than guessed. +PARAMETER_TYPES = frozenset({"date", "enum", "number", "string"}) + +FRAGMENT_UUID_NAMESPACE = uuid.uuid5( + uuid.NAMESPACE_URL, "https://tableau.com/plugin-codex/bookmark-fragment" +) +WRAPPER_TAG = "codex-fragment-wrapper" + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +STARTER_RELATIVE_PATH = "starters/minimal-workbook.twb" + + +class ResourceError(ValueError): + """Raised for an invalid resource request or an unsafe rendering result.""" + + +class FieldMetadata(NamedTuple): + """One target field's declared type and role. + + Any member is ``None`` when the workbook does not declare it; a caller + that needs a value must decide for itself whether to fail rather than + substitute one. + """ + + datatype: str | None + user_datatype: str | None + role: str | None + + +class DatasourceMetadata(NamedTuple): + """One global datasource's display caption and fields. + + ``caption`` is the label Tableau shows; the internal name, which may be a + ``federated.`` string, stays the key this is looked up by. + """ + + caption: str + fields: dict[str, FieldMetadata] + + +def _datatype_family(datatype: str | None) -> str | None: + """Return the compatibility family of a Tableau datatype, if it has one.""" + return DATATYPE_FAMILIES.get((datatype or "").strip().lower()) + + +def load_catalog(plugin_root: Path) -> dict[str, object]: + """Load and parse ``resources/catalog.json`` under ``plugin_root``.""" + catalog_path = Path(plugin_root) / "resources" / "catalog.json" + return json.loads(catalog_path.read_text(encoding="utf-8")) + + +def find_resource(catalog: dict[str, object], resource_id: str) -> dict[str, object]: + """Return the catalog entry with ``id == resource_id``. + + Raises ``KeyError`` if no such resource exists. + """ + for entry in catalog["resources"]: + if entry["id"] == resource_id: + return entry + raise KeyError(resource_id) + + +def _tokenize(text: str) -> list[str]: + return TOKEN_RE.findall(text.lower()) + + +def _searchable_text(entry: dict[str, object]) -> str: + parts = [ + entry.get("id") or "", + entry.get("intent") or "", + entry.get("family") or "", + " ".join(entry.get("keywords") or []), + ] + return " ".join(parts).lower() + + +def search_resources( + catalog: dict[str, object], + *, + query: str | None = None, + family: str | None = None, + resource_type: str | None = None, + tier: str | None = None, +) -> list[dict[str, object]]: + """Filter and rank catalog entries by query terms and exact-match filters. + + Search splits ``query`` into lowercase alphanumeric terms. An entry + matches only when every term appears in its ID, intent, family, or + keywords. Results are sorted with exact ID matches first, then entries + whose intent contains a query term, then by ID. + """ + entries = list(catalog["resources"]) + + if family is not None: + entries = [entry for entry in entries if entry.get("family") == family] + if resource_type is not None: + entries = [entry for entry in entries if entry.get("type") == resource_type] + if tier is not None: + entries = [entry for entry in entries if entry.get("tier") == tier] + + terms = _tokenize(query) if query else [] + if terms: + matched = [] + for entry in entries: + haystack = _searchable_text(entry) + if all(term in haystack for term in terms): + matched.append(entry) + entries = matched + + def sort_key(entry: dict[str, object]) -> tuple[int, int, str]: + resource_id = entry["id"] + exact_id_match = 0 if terms and _tokenize(resource_id) == terms else 1 + intent_text = (entry.get("intent") or "").lower() + intent_match = 0 if terms and any(term in intent_text for term in terms) else 1 + return (exact_id_match, intent_match, resource_id) + + entries.sort(key=sort_key) + return entries + + +def parse_assignments(values: list[str]) -> dict[str, str]: + """Parse ``NAME=VALUE`` CLI assignments into a mapping. + + Rejects a missing separator, a blank name or value, and a repeated name so + a mistyped flag can never silently drop or override an earlier mapping. + """ + assignments: dict[str, str] = {} + for value in values: + if "=" not in value: + raise ResourceError(f"Expected NAME=VALUE, got: {value}") + name, mapped = value.split("=", 1) + normalized_name = name.strip() + normalized_value = mapped.strip() + if ( + not normalized_name + or not normalized_value + or normalized_name in assignments + ): + raise ResourceError(f"Invalid or duplicate assignment: {value}") + assignments[normalized_name] = normalized_value + return assignments + + +def escape_bracket(name: str) -> str: + """Escape a Tableau identifier for use inside ``[...]``.""" + return name.replace("]", "]]") + + +def unescape_bracket(name: str) -> str: + """Decode Tableau's doubled closing brackets in an identifier.""" + return name.replace("]]", "]") + + +def escape_attribute(value: str) -> str: + """XML-escape a value for use inside a single- or double-quoted attribute.""" + return xml_escape(value, {"'": "'", '"': """}) + + +def _unescape(value: str) -> str: + return html.unescape(value) + + +def _logical_field_name(raw: str) -> str: + """Decode a raw bracket-content field name into its catalog form.""" + return unescape_bracket(_unescape(raw)) + + +def _bracket_reference(name: str) -> str: + """Render ``name`` as it must appear inside a bracketed XML reference.""" + return escape_attribute(escape_bracket(name)) + + +def _tag_end(data: bytes, index: int) -> int: + """Return the offset just past the ``>`` closing the tag at ``index``. + + Quote-aware so a ``>`` inside an attribute value is not mistaken for the + end of the tag. + """ + quote = b"" + position = index + while position < len(data): + char = data[position : position + 1] + if quote: + if char == quote: + quote = b"" + elif char in (b"'", b'"'): + quote = char + elif char == b">": + return position + 1 + position += 1 + raise ResourceError("Malformed bookmark: unterminated XML tag") + + +def _scan_elements(data: bytes) -> list[tuple[str, int, int, int]]: + """Return ``(tag, depth, start, end)`` byte spans for every element. + + Offsets come from the expat parser, so a span is only ever reported for + structure the parser itself confirmed. + """ + parser = expat.ParserCreate() + elements: list[tuple[str, int, int, int]] = [] + stack: list[tuple[str, int, int, int, bool]] = [] + + def start(name: str, _attributes: dict[str, str]) -> None: + start_offset = parser.CurrentByteIndex + start_tag_end = _tag_end(data, start_offset) + stack.append( + ( + name, + len(stack), + start_offset, + start_tag_end, + data[start_tag_end - 2 : start_tag_end] == b"/>", + ) + ) + + def end(name: str) -> None: + tag, depth, start_offset, start_tag_end, self_closing = stack.pop() + end_offset = ( + start_tag_end + if self_closing + else _tag_end(data, parser.CurrentByteIndex) + ) + elements.append((tag, depth, start_offset, end_offset)) + + parser.StartElementHandler = start + parser.EndElementHandler = end + try: + parser.Parse(data, True) + except expat.ExpatError as error: + raise ResourceError(f"Malformed bookmark XML: {error}") from error + return elements + + +def _tag_attribute_spans(data: bytes, start: int) -> list[tuple[str, str, int, int]]: + """Return ``(name, raw value, byte start, byte end)`` per attribute. + + The spans are absolute byte offsets into ``data`` so an attribute can be + spliced out without reserializing its element. + """ + start_tag = data[start : _tag_end(data, start)].decode("utf-8") + spans: list[tuple[str, str, int, int]] = [] + for match in ATTRIBUTE_RE.finditer(start_tag): + offset = start + len(start_tag[: match.start()].encode("utf-8")) + spans.append( + ( + match.group(1), + match.group(3), + offset, + offset + len(match.group(0).encode("utf-8")), + ) + ) + return spans + + +def _tag_attributes(data: bytes, start: int) -> dict[str, str]: + """Return raw, still XML-escaped attributes of the tag at ``start``.""" + return { + name: value for name, value, _start, _end in _tag_attribute_spans(data, start) + } + + +def _remove_elements(text: str, tag: str) -> str: + """Delete every outermost ```` element from a fragment.""" + data = text.encode("utf-8") + candidates = [ + (start, end) + for element_tag, _depth, start, end in _scan_elements(data) + if element_tag == tag + ] + spans: list[tuple[int, int]] = [] + for start, end in sorted(candidates, key=lambda span: (span[0], -span[1])): + if any( + outer_start <= start and end <= outer_end + for outer_start, outer_end in spans + ): + continue + spans.append((start, end)) + + for start, end in sorted(spans, reverse=True): + line_start = start + while line_start > 0 and data[line_start - 1 : line_start] in (b" ", b"\t"): + line_start -= 1 + if data[line_start - 1 : line_start] != b"\n": + line_start = start + stop = end + if data[stop : stop + 1] == b"\n": + stop += 1 + data = data[:line_start] + data[stop:] + return data.decode("utf-8") + + +def _namespace_declarations(root_start_tag: str) -> str: + return " ".join( + match.group(0) for match in NAMESPACE_DECLARATION_RE.finditer(root_start_tag) + ) + + +def _wrap_fragment(fragment: str, namespaces: str) -> str: + opening = f"<{WRAPPER_TAG} {namespaces}>" if namespaces else f"<{WRAPPER_TAG}>" + return f"{opening}\n{fragment}\n" + + +def _parse_wrapped(fragment: str, namespaces: str, kind: str) -> ET.Element: + try: + wrapper = ET.fromstring(_wrap_fragment(fragment, namespaces)) + except ET.ParseError as error: + raise ResourceError( + f"Rendered {kind} fragment is not well-formed XML: {error}" + ) from error + children = list(wrapper) + if len(children) != 1: + raise ResourceError( + f"Rendered {kind} fragment must contain exactly one root element" + ) + return children[0] + + +def _confirm_fragment(fragment: str, expected: ET.Element, namespaces: str) -> None: + """Verify a spliced fragment reparses to the element the parser reported.""" + extracted = _parse_wrapped(fragment, namespaces, expected.tag) + if extracted.tag != expected.tag or extracted.attrib != expected.attrib: + raise ResourceError( + f"Extracted <{expected.tag}> fragment does not match the parsed bookmark" + ) + if [child.tag for child in extracted] != [child.tag for child in expected]: + raise ResourceError( + f"Extracted <{expected.tag}> fragment lost or gained child elements" + ) + + +def _template_path(plugin_root: Path, entry: dict[str, object]) -> Path: + relative = str(entry["path"]) + if relative.startswith("./"): + relative = relative[2:] + return Path(plugin_root) / "resources" / relative + + +def _executable_entry( + catalog: dict[str, object], resource_id: str +) -> dict[str, object]: + try: + entry = find_resource(catalog, resource_id) + except KeyError: + raise ResourceError(f"Unknown resource: {resource_id}") from None + if entry.get("tier") != "executable": + reasons = ( + ", ".join(entry.get("classificationReasons") or []) or "not executable" + ) + raise ResourceError( + f"Resource {resource_id} is reference-only and cannot be rendered " + f"({reasons})" + ) + return entry + + +def _read_verified_bookmark(plugin_root: Path, entry: dict[str, object]) -> bytes: + path = _template_path(plugin_root, entry) + try: + data = path.read_bytes() + except OSError as error: + raise ResourceError(f"Cannot read template {entry['path']}: {error}") from error + digest = hashlib.sha256(data).hexdigest() + if digest != entry.get("sha256"): + raise ResourceError( + f"Template {entry['path']} does not match the catalog hash " + f"(expected {entry.get('sha256')}, found {digest}); regenerate the catalog" + ) + return data + + +def _single_span( + elements: list[tuple[str, int, int, int]], tag: str +) -> tuple[int, int] | None: + spans = [ + (start, end) + for element_tag, depth, start, end in elements + if depth == 1 and element_tag == tag + ] + if len(spans) > 1: + return None + return spans[0] if spans else None + + +def _extract_fragments(data: bytes) -> tuple[str, str, str | None, ET.Element, str]: + """Extract the ````, ````, and root ```` fragments. + + Offsets come from expat and every fragment is reparsed and compared with + the element ``ElementTree`` reported, so a text splice can never silently + disagree with the document's real structure. + """ + try: + root = ET.fromstring(data) + except ET.ParseError as error: + raise ResourceError(f"Malformed bookmark XML: {error}") from error + if root.tag != "bookmark": + raise ResourceError( + f"Template root element must be , found <{root.tag}>" + ) + + elements = _scan_elements(data) + root_start = next( + start + for tag, depth, start, _end in elements + if depth == 0 and tag == "bookmark" + ) + namespaces = _namespace_declarations( + data[root_start : _tag_end(data, root_start)].decode("utf-8") + ) + + window_span = _single_span(elements, "window") + table_span = _single_span(elements, "table") + if ( + window_span is None + or table_span is None + or len(root.findall("window")) != 1 + or len(root.findall("table")) != 1 + ): + raise ResourceError( + "Template must contain exactly one and one
element" + ) + cards_span = _single_span(elements, "cards") + + window = data[window_span[0] : window_span[1]].decode("utf-8") + table = data[table_span[0] : table_span[1]].decode("utf-8") + _confirm_fragment(window, root.find("window"), namespaces) + _confirm_fragment(table, root.find("table"), namespaces) + cards_spans = [ + (start, end) + for tag, depth, start, end in elements + if depth == 1 and tag == "cards" + ] + if len(cards_spans) > 1: + raise ResourceError( + "Template contains more than one root-level element" + ) + cards = ( + data[cards_span[0] : cards_span[1]].decode("utf-8") + if cards_span is not None + else None + ) + return window, table, cards, root, namespaces + + +def _hoist_cards(window: str, cards: str | None) -> str: + """Move a root-level ```` block into a window that lacks one.""" + if cards is None: + return window + data = window.encode("utf-8") + existing = [ + tag + for tag, depth, _start, _end in _scan_elements(data) + if depth == 1 and tag == "cards" + ] + if existing: + return window + insert_at = _tag_end(data, 0) + if data[insert_at - 2 : insert_at] == b"/>": + raise ResourceError("Cannot hoist into a self-closing ") + return ( + data[:insert_at].decode("utf-8") + + "\n" + + cards + + data[insert_at:].decode("utf-8") + ) + + +def _donor_dependency_spans( + data: bytes, elements: list[tuple[str, int, int, int]], donor: str +) -> list[tuple[int, int]]: + """Return the byte spans of ```` for the donor.""" + return [ + (start, end) + for tag, _depth, start, end in elements + if tag == "datasource-dependencies" + and _unescape(_tag_attributes(data, start).get("datasource") or "") == donor + ] + + +def _declared_fields(table: str, donor: str) -> tuple[dict[str, str], set[str]]: + """Return the donor's column-instance-to-base map and declared base fields. + + Scoped to ```` blocks belonging to the donor so a + pseudo-datasource block (for example workbook parameters) is never treated + as a mappable donor column. + """ + data = table.encode("utf-8") + elements = _scan_elements(data) + scopes = _donor_dependency_spans(data, elements, donor) + if not scopes: + raise ResourceError( + f"Template does not contain datasource dependencies for donor {donor}" + ) + + instances: dict[str, str] = {} + columns: set[str] = set() + for tag, _depth, start, _end in elements: + if tag not in ("column", "column-instance"): + continue + if not any(begin <= start < finish for begin, finish in scopes): + continue + attributes = _tag_attributes(data, start) + name = attributes.get("name") or "" + if not (name.startswith("[") and name.endswith("]")): + continue + bare = name[1:-1] + if tag == "column-instance": + base = attributes.get("column") or "" + if base.startswith("[") and base.endswith("]"): + instances[bare] = base[1:-1] + elif attributes.get("datatype"): + columns.add(bare) + return instances, columns + + +def _remove_unused_donor_declarations( + table: str, donor: str, required_fields: set[str] +) -> str: + """Drop donor column metadata that has no explicit mapping contract.""" + data = table.encode("utf-8") + elements = _scan_elements(data) + scopes = _donor_dependency_spans(data, elements, donor) + spans: list[tuple[int, int]] = [] + for tag, _depth, start, end in elements: + if tag not in ("column", "column-instance"): + continue + if not any(begin <= start < finish for begin, finish in scopes): + continue + attributes = _tag_attributes(data, start) + reference = ( + attributes.get("name") if tag == "column" else attributes.get("column") + ) or "" + if not (reference.startswith("[") and reference.endswith("]")): + continue + logical_name = _logical_field_name(reference[1:-1]) + if logical_name in required_fields or _is_exempt_field(logical_name): + continue + spans.append((start, end)) + + for start, end in sorted(spans, reverse=True): + line_start = start + while line_start > 0 and data[line_start - 1 : line_start] in (b" ", b"\t"): + line_start -= 1 + if data[line_start - 1 : line_start] != b"\n": + line_start = start + stop = end + if data[stop : stop + 1] == b"\n": + stop += 1 + data = data[:line_start] + data[stop:] + return data.decode("utf-8") + + +def _catalog_source_datatypes(entry: dict) -> dict[str, str]: + """Return the datatype the catalog records for each donor source field.""" + return { + str(field["sourceField"]): str(field["datatype"]) + for field in entry.get("fields") or [] + if field.get("sourceField") and field.get("datatype") + } + + +def _donor_column_datatypes(table: str, donor: str) -> dict[str, str]: + """Return the datatype each donor dependency ```` declares. + + Used only as a fallback source contract: the catalog records the same + datatypes and is authoritative, but a template whose catalog entry predates + that field still declares it here. + """ + data = table.encode("utf-8") + elements = _scan_elements(data) + scopes = _donor_dependency_spans(data, elements, donor) + declared: dict[str, str] = {} + for tag, _depth, start, _end in elements: + if tag != "column" or not any( + begin <= start < finish for begin, finish in scopes + ): + continue + attributes = _tag_attributes(data, start) + name = attributes.get("name") or "" + datatype = attributes.get("datatype") + if datatype and name.startswith("[") and name.endswith("]"): + declared.setdefault(_logical_field_name(name[1:-1]), _unescape(datatype)) + return declared + + +def _attribute_quote(data: bytes, start: int, end: int) -> str: + """Return the quote character an attribute's value is written with.""" + text = data[start:end].decode("utf-8") + return text[text.index("=") + 1 :].lstrip()[0] + + +def _retype_mapped_columns( + table: str, + donor: str, + field_mappings: dict[str, str], + target_fields: dict[str, FieldMetadata], +) -> str: + """Restate a mapped dependency column's type from the target's metadata. + + Once a declaration's name has been rewritten to a target field, the + donor's ``datatype``, ``user-datatype``, and ``role`` describe a field that + is no longer there, so they are replaced with the target's own. Nothing + else on the declaration is touched: the aggregation, the pivot, the + nominal/ordinal/quantitative pair and the rest all stay correct because a + mapping may not cross a datatype family. An attribute the donor did not + declare is not added, and a value the workbook does not declare is not + invented — for ``user-datatype`` the target's datatype stands in, which is + what Tableau writes for a field whose display type is its storage type. + + Each replacement is spliced over the attribute's own byte span, so no + other byte of the fragment moves. + """ + if not field_mappings or not target_fields: + return table + data = table.encode("utf-8") + elements = _scan_elements(data) + scopes = _donor_dependency_spans(data, elements, donor) + edits: list[tuple[int, int, bytes]] = [] + for tag, _depth, start, _end in elements: + if tag != "column" or not any( + begin <= start < finish for begin, finish in scopes + ): + continue + spans = _tag_attribute_spans(data, start) + raw = next((value for name, value, _s, _e in spans if name == "name"), "") + if not (raw.startswith("[") and raw.endswith("]")): + continue + metadata = target_fields.get( + field_mappings.get(_logical_field_name(raw[1:-1]), "") + ) + if metadata is None: + continue + wanted = { + "datatype": metadata.datatype, + "user-datatype": metadata.user_datatype or metadata.datatype, + "role": metadata.role, + } + for name, value, span_start, span_end in spans: + if name not in DEPENDENCY_METADATA_ATTRIBUTES: + continue + replacement = wanted[name] + if replacement is None or _unescape(value) == replacement: + continue + quote = _attribute_quote(data, span_start, span_end) + edits.append( + ( + span_start, + span_end, + f"{name}={quote}{escape_attribute(replacement)}{quote}".encode( + "utf-8" + ), + ) + ) + for start, end, replacement in sorted(edits, reverse=True): + data = data[:start] + replacement + data[end:] + return data.decode("utf-8") + + +def _donor_metadata_references( + table: str, donor: str +) -> list[tuple[str, str, int, int]]: + """Return donor-only metadata references as ``(logical, raw, start, end)``. + + Each entry is one occurrence of a :data:`DONOR_METADATA_ATTRIBUTES` + attribute whose value is a single bracketed donor field, with the byte span + of the whole attribute so it can be stripped when the caller omits it. + """ + data = table.encode("utf-8") + elements = _scan_elements(data) + scopes = _donor_dependency_spans(data, elements, donor) + found: list[tuple[str, str, int, int]] = [] + for tag, _depth, start, _end in elements: + if not any(tag == element for element, _attribute in DONOR_METADATA_ATTRIBUTES): + continue + if not any(begin <= start < finish for begin, finish in scopes): + continue + for name, value, span_start, span_end in _tag_attribute_spans(data, start): + if (tag, name) not in DONOR_METADATA_ATTRIBUTES: + continue + if not (value.startswith("[") and value.endswith("]")): + raise ResourceError( + f"Template metadata attribute {name} is not a single field " + f"reference: {value}" + ) + raw = value[1:-1] + logical_name = _logical_field_name(raw) + if _is_exempt_field(logical_name): + continue + found.append((logical_name, raw, span_start, span_end)) + return found + + +def _donor_metadata_fields(table: str, donor: str) -> dict[str, set[str]]: + """Map each metadata-only donor field to the raw forms naming it.""" + discovered: dict[str, set[str]] = {} + for logical_name, raw, _start, _end in _donor_metadata_references(table, donor): + discovered.setdefault(logical_name, set()).add(raw) + return discovered + + +def _strip_unmapped_donor_metadata(table: str, donor: str, mapped: set[str]) -> str: + """Delete donor-only metadata attributes the caller did not map. + + Dropping provenance metadata is safe — Tableau re-derives it from the + target datasource — and it is the only alternative to emitting a donor + field name the target datasource may not have. + """ + data = table.encode("utf-8") + spans = sorted( + ( + (start, end) + for logical_name, _raw, start, end in _donor_metadata_references( + table, donor + ) + if logical_name not in mapped + ), + reverse=True, + ) + for start, end in spans: + while start > 0 and data[start - 1 : start] in (b" ", b"\t"): + start -= 1 + data = data[:start] + data[end:] + return data.decode("utf-8") + + +def _is_exempt_field(logical_name: str) -> bool: + return ( + logical_name.startswith(":") + or logical_name in PSEUDO_FIELD_NAMES + or bool(GENERATED_FIELD_RE.match(logical_name)) + ) + + +def _donor_source_fields( + text: str, donor: str, instances: dict[str, str], columns: set[str] +) -> dict[str, set[str]]: + """Map each donor field logical name to the raw forms found in ``text``. + + Every donor-qualified reference in the raw XML is resolved, not only the + fields the catalog recorded as placed on a shelf, so a reference hiding in + a card, style rule, or sort can never survive unmapped. + """ + discovered: dict[str, set[str]] = {} + for datasource_raw, field_raw in QUALIFIED_REF_RE.findall(text): + if _logical_field_name(datasource_raw) != donor: + continue + if _is_exempt_field(_logical_field_name(field_raw)): + continue + base_raw = _resolve_base_field(field_raw, instances, columns) + if base_raw is None: + raise ResourceError( + f"Template contains an unresolved donor field reference: " + f"[{donor}].[{_logical_field_name(field_raw)}]" + ) + discovered.setdefault(_logical_field_name(base_raw), set()).add(base_raw) + return discovered + + +def _resolve_base_field( + field_raw: str, instances: dict[str, str], columns: set[str] +) -> str | None: + if field_raw in instances: + return instances[field_raw] + if field_raw in columns: + return field_raw + derived = DERIVED_SEGMENT_RE.match(field_raw) + if derived: + return derived.group(2) + return None + + +def _check_supplied_value(label: str, name: str, value: str) -> None: + if not value.strip(): + raise ResourceError(f"{label} {name} must have a non-empty value") + if TEMPLATE_TOKEN_RE.search(value) or "{{" in value: + raise ResourceError( + f"{label} {name} value must not contain a template token: {value}" + ) + + +def _validate_field_mappings( + required: dict[str, set[str]], + optional: dict[str, set[str]], + field_mappings: dict[str, str] | None, +) -> dict[str, str]: + supplied = dict(field_mappings or {}) + allowed = set(required) | set(optional) + unknown = sorted(name for name in supplied if name not in allowed) + if unknown: + raise ResourceError( + f"Unknown field mappings: {', '.join(unknown)} " + f"(declared fields: {', '.join(sorted(allowed))})" + ) + missing = sorted(name for name in required if name not in supplied) + if missing: + raise ResourceError(f"Missing field mappings: {', '.join(missing)}") + for name, target in supplied.items(): + _check_supplied_value("Field mapping", name, target) + return supplied + + +def parameter_contracts(entry: dict[str, object]) -> dict[str, dict[str, object]]: + """Return the resource's typed parameter contracts, keyed by name. + + The generated catalog carries a complete typed contract for every explicit + ``{{PARAMETER}}`` token, so validation never depends on + ``catalog-overrides.json`` being present at runtime. A declared token + without a recognized type — a stale or hand-edited catalog — is rejected + rather than validated loosely. + """ + contracts: dict[str, dict[str, object]] = {} + for declared in entry.get("parameters") or []: + if not isinstance(declared, dict) or not declared.get("name"): + raise ResourceError( + f"Resource {entry['id']} declares parameter {declared!r} without a " + "typed contract; regenerate the catalog" + ) + name = str(declared["name"]) + kind = declared.get("type") + if kind not in PARAMETER_TYPES: + raise ResourceError( + f"Parameter {name} of resource {entry['id']} has no typed contract " + f"(type={kind!r}); regenerate the catalog" + ) + if kind == "enum" and not (declared.get("allowed") or []): + raise ResourceError( + f"Enum parameter {name} of resource {entry['id']} declares no " + "allowed values; regenerate the catalog" + ) + contracts[name] = declared + return contracts + + +def _validate_parameters( + contracts: dict[str, dict[str, object]], + parameters: dict[str, str] | None, +) -> dict[str, str]: + supplied = dict(parameters or {}) + declared_names = list(contracts) + unknown = sorted(name for name in supplied if name not in declared_names) + if unknown: + raise ResourceError( + f"Unknown parameters: {', '.join(unknown)} " + f"(declared parameters: {', '.join(sorted(declared_names)) or 'none'})" + ) + + validated: dict[str, str] = {} + missing: list[str] = [] + for name in sorted(declared_names): + contract = contracts[name] + if name not in supplied: + if contract.get("required", True): + missing.append(name) + continue + value = supplied[name] + _check_supplied_value("Parameter", name, value) + kind = contract["type"] + if kind == "date": + try: + datetime.date.fromisoformat(value) + except ValueError: + raise ResourceError( + f"Parameter {name} must be an ISO-8601 date (YYYY-MM-DD), " + f"got: {value}" + ) from None + elif kind == "enum": + allowed = contract.get("allowed") or [] + if value not in allowed: + raise ResourceError( + f"Parameter {name} must be one of: {', '.join(allowed)} " + f"(got: {value})" + ) + elif kind == "number": + try: + float(value) + except ValueError: + raise ResourceError( + f"Parameter {name} must be a number, got: {value}" + ) from None + validated[name] = value + if missing: + raise ResourceError(f"Missing parameters: {', '.join(missing)}") + return validated + + +def _replace_datasource( + text: str, donor: str, target: str, target_caption: str | None = None +) -> str: + """Rewrite donor datasource names in qualified references and attributes. + + ``name`` and ``datasource`` attributes address the datasource, so they take + its internal name, and so does every qualified reference. ``caption`` is + the label Tableau displays, so it takes ``target_caption``: a workbook's + internal name is often a ``federated.`` string, and putting that in + the caption would show the hash to the reader. It defaults to the internal + name, which is the right label for a datasource that declares no caption. + """ + text = QUALIFIED_REF_RE.sub( + lambda match: ( + f"[{_bracket_reference(target)}].[{match.group(2)}]" + if _logical_field_name(match.group(1)) == donor + else match.group(0) + ), + text, + ) + replacements = { + attribute: escape_attribute( + target if attribute != "caption" or target_caption is None + else target_caption + ) + for attribute in DATASOURCE_NAME_ATTRIBUTES + } + + def replace_attribute(match: re.Match[str]) -> str: + name, quote, value = match.groups() + if name in DATASOURCE_NAME_ATTRIBUTES and _unescape(value) == donor: + return f"{name}={quote}{replacements[name]}{quote}" + return match.group(0) + + return ATTRIBUTE_RE.sub(replace_attribute, text) + + +def _field_patterns(raw_forms: list[str]) -> tuple[re.Pattern[str], re.Pattern[str]]: + # Longest raw form first so a field name that is a prefix of another can + # never win the match. + alternation = "|".join( + re.escape(form) for form in sorted(raw_forms, key=len, reverse=True) + ) + base = re.compile(rf"\[({alternation})\](?!\.\[)") + derived = re.compile(rf"\[([^\[\]:]+):({alternation}):([^\[\]:]+)\]") + return base, derived + + +def _replace_fields(text: str, raw_to_target: dict[str, str]) -> str: + """Rewrite bracketed base fields and ``derivation:field:role`` segments. + + Both replacements run as a single pass over the alternation of source + names so mappings that swap two fields cannot chain into each other. + """ + if not raw_to_target: + return text + base, derived = _field_patterns(list(raw_to_target)) + text = base.sub(lambda match: f"[{raw_to_target[match.group(1)]}]", text) + return derived.sub( + lambda match: ( + f"[{match.group(1)}:{raw_to_target[match.group(2)]}:{match.group(3)}]" + ), + text, + ) + + +def _replace_parameters(text: str, parameters: dict[str, str]) -> str: + for name, value in parameters.items(): + text = text.replace("{{" + name + "}}", escape_attribute(value)) + return text + + +def _fragment_uuid(resource_id: str, worksheet_name: str, kind: str) -> str: + derived = uuid.uuid5( + FRAGMENT_UUID_NAMESPACE, f"{resource_id}\n{worksheet_name}\n{kind}" + ) + return "{%s}" % str(derived).upper() + + +def _replace_simple_ids(fragment: str, kind: str, identifier: str) -> str: + """Replace the fragment's own ``simple-id`` with a derived identifier. + + One identifier is derived per fragment, so a fragment carrying more than + one ```` is rejected rather than given duplicate identifiers. + """ + if len(SIMPLE_ID_RE.findall(fragment)) > 1: + raise ResourceError( + f"Template {kind} fragment declares more than one " + ) + return SIMPLE_ID_RE.sub( + lambda match: f"{match.group(1)}{match.group(2)}{identifier}{match.group(2)}", + fragment, + ) + + +def _set_window_identity(window: str, worksheet_name: str) -> str: + """Force the window's class and name to the output worksheet name.""" + data = window.encode("utf-8") + tag_end = _tag_end(data, 0) + start_tag = data[:tag_end].decode("utf-8") + self_closing = start_tag.endswith("/>") + preserved = [ + f"{name}={quote}{value}{quote}" + for name, quote, value in ( + (match.group(1), match.group(2), match.group(3)) + for match in ATTRIBUTE_RE.finditer(start_tag) + ) + if name not in ("class", "name") + ] + attributes = [ + "class='worksheet'", + f"name='{escape_attribute(worksheet_name)}'", + *preserved, + ] + rebuilt = f"' if self_closing else '>'}" + return rebuilt + data[tag_end:].decode("utf-8") + + +def _without_target_caption(fragment: str, target_caption: str | None) -> str: + """Drop every ``caption`` attribute holding the target's own label. + + The donor-text scan below looks for the donor's name anywhere in the + fragment, which is deliberately blunt: it is the check that catches donor + residue in places this module does not enumerate. But a target datasource + may legitimately be captioned after the donor — "Sample - Superstore" is a + real workbook's label, not just a template's donor — and the renderer + writes that caption itself. Removing exactly the attributes it wrote, and + only where the value is the whole caption, keeps the scan blunt everywhere + else: a caption on another element, or one that merely contains the + donor's name, is left in place to be judged. + """ + if target_caption is None: + return fragment + return ATTRIBUTE_RE.sub( + lambda match: ( + "" + if match.group(1) == "caption" + and _unescape(match.group(3)) == target_caption + else match.group(0) + ), + fragment, + ) + + +def _reject_unsafe_output( + fragments: dict[str, str], + *, + donor: str, + target_datasource: str, + raw_to_logical: dict[str, str], + field_mappings: dict[str, str], + target_caption: str | None = None, +) -> None: + """Fail closed on any donor residue, stale field, or unresolved token. + + ``raw_to_logical`` covers every donor field reference discovered in the + template, mapped or not, so an unmapped donor field that escaped stripping + is caught here rather than emitted. + + ``target_caption`` is the label the renderer gave the target datasource. + It is exempt from the donor-name scan, because a caption displays a + datasource rather than addressing one: no amount of donor-looking text in + it can make the output point back at the donor. Everything that does + address a datasource — a qualified reference, a ``name`` or ``datasource`` + attribute — is judged unchanged. Omitting it exempts nothing. + """ + # A source name that is also somebody's mapping target legitimately + # survives in the output, so it cannot be checked for residue. + targets = set(field_mappings.values()) + stale_raw = [ + raw + for raw, logical in raw_to_logical.items() + if field_mappings.get(logical) != logical and logical not in targets + ] + base_pattern, derived_pattern = ( + _field_patterns(stale_raw) if stale_raw else (None, None) + ) + + for kind, fragment in fragments.items(): + if donor != target_datasource: + donor_qualified = any( + _logical_field_name(datasource_raw) == donor + for datasource_raw, _field_raw in QUALIFIED_REF_RE.findall(fragment) + ) + donor_attribute = any( + name in DATASOURCE_ADDRESS_ATTRIBUTES and _unescape(value) == donor + for name, _quote, value in ATTRIBUTE_RE.findall(fragment) + ) + donor_text = donor not in target_datasource and donor in _unescape( + _without_target_caption(fragment, target_caption) + ) + if donor_qualified or donor_attribute or donor_text: + raise ResourceError( + f"Rendered {kind} fragment still references the donor " + f"datasource {donor}" + ) + if base_pattern is not None: + stale = base_pattern.search(fragment) or derived_pattern.search(fragment) + if stale: + raise ResourceError( + f"Rendered {kind} fragment still references the unmapped donor " + f"field {stale.group(0)}" + ) + token = TEMPLATE_TOKEN_RE.search(fragment) + if token: + raise ResourceError( + f"Rendered {kind} fragment contains an unresolved template token: " + f"{token.group(0)}" + ) + foreign = next( + ( + match.group(0) + for match in FEDERATED_RE.finditer(fragment) + if _unescape(match.group(0)) != target_datasource + ), + None, + ) + if foreign is not None: + raise ResourceError( + f"Rendered {kind} fragment references the federated datasource " + f"{foreign}, which is not the target datasource " + f"{target_datasource}" + ) + + +def render_bookmark( + plugin_root: Path, + resource_id: str, + worksheet_name: str, + datasource_name: str, + field_mappings: dict[str, str], + parameters: dict[str, str], + *, + datasource_caption: str | None = None, + target_fields: dict[str, FieldMetadata] | None = None, +) -> tuple[str, str]: + """Render one executable bookmark into worksheet and window fragments. + + Returns the ```` and ```` XML text for insertion into a + workbook. Raises :class:`ResourceError` for a non-executable resource, + catalog drift, an incomplete or undeclared mapping, an invalid parameter, + a mapping the target's types cannot support, or any output that still + carries donor state. + + ``datasource_caption`` is the label the rendered view shows for the target + datasource, defaulting to its internal name. ``target_fields`` is the + target's declared field metadata; supplying it enables the datatype + compatibility check and restates each mapped dependency declaration from + the target's own types. Both are optional so a caller holding only a + datasource name can still render, exactly as before. + """ + # The caption is copied into the rendered view, so it is held to the same + # standard as the names: a workbook whose caption still carries a template + # token would otherwise push that token into the output. + supplied = [ + ("worksheet_name", worksheet_name), + ("datasource_name", datasource_name), + ] + if datasource_caption is not None: + supplied.append(("datasource_caption", datasource_caption)) + for label, value in supplied: + if not value.strip(): + raise ResourceError(f"{label} must not be empty") + if TEMPLATE_TOKEN_RE.search(value) or "{{" in value: + raise ResourceError( + f"{label} must not contain a template token: {value}" + ) + + plugin_root = Path(plugin_root) + entry = _executable_entry(load_catalog(plugin_root), resource_id) + data = _read_verified_bookmark(plugin_root, entry) + + donors = list(entry.get("datasources") or []) + if len(donors) != 1: + raise ResourceError( + f"Resource {resource_id} must declare exactly one donor datasource, " + f"found: {', '.join(donors) or 'none'}" + ) + donor = donors[0] + + window, table, cards, _root, namespaces = _extract_fragments(data) + + window = _hoist_cards(window, cards) + window = _remove_elements(window, "highlight") + table = _remove_elements(table, "highlight") + + instances, columns = _declared_fields(table, donor) + required = _donor_source_fields(window + table, donor, instances, columns) + for field in entry.get("fields") or []: + source = field["sourceField"] + required.setdefault(source, set()).add(_bracket_reference(source)) + + # Donor-only provenance metadata names a column without qualifying it, so + # it is offered as an optional mapping and stripped when unmapped. + metadata_fields = { + logical_name: raw_forms + for logical_name, raw_forms in _donor_metadata_fields(table, donor).items() + if logical_name not in required + } + + mappings = _validate_field_mappings(required, metadata_fields, field_mappings) + validated_parameters = _validate_parameters(parameter_contracts(entry), parameters) + + table = _strip_unmapped_donor_metadata(table, donor, set(mappings)) + table = _remove_unused_donor_declarations( + table, donor, set(required) | set(mappings) + ) + + if target_fields is not None: + source_types = _donor_column_datatypes(table, donor) + source_types.update(_catalog_source_datatypes(entry)) + _validate_mapping_types(source_types, target_fields, mappings) + table = _retype_mapped_columns(table, donor, mappings, target_fields) + + discovered = { + logical_name: set(raw_forms) for logical_name, raw_forms in required.items() + } + for logical_name, raw_forms in metadata_fields.items(): + discovered.setdefault(logical_name, set()).update(raw_forms) + + raw_to_logical: dict[str, str] = {} + for logical, raw_forms in discovered.items(): + for raw in raw_forms: + raw_to_logical[raw] = logical + raw_to_target = { + raw: _bracket_reference(mappings[logical]) + for raw, logical in raw_to_logical.items() + if logical in mappings + } + + # A datasource that declares no caption is labelled by its internal name, + # so that is the label the output carries and the one exempt from the + # donor-name scan below. + caption = datasource_name if datasource_caption is None else datasource_caption + + rendered: dict[str, str] = {} + for kind, fragment in (("worksheet", table), ("window", window)): + fragment = _replace_datasource(fragment, donor, datasource_name, caption) + fragment = _replace_fields(fragment, raw_to_target) + fragment = _replace_parameters(fragment, validated_parameters) + fragment = _replace_simple_ids( + fragment, kind, _fragment_uuid(resource_id, worksheet_name, kind) + ) + rendered[kind] = fragment + + rendered["worksheet"] = ( + f"\n" + f"{rendered['worksheet']}\n" + "" + ) + rendered["window"] = _set_window_identity(rendered["window"], worksheet_name) + + _reject_unsafe_output( + rendered, + donor=donor, + target_datasource=datasource_name, + raw_to_logical=raw_to_logical, + field_mappings=mappings, + target_caption=caption, + ) + for kind, fragment in rendered.items(): + _parse_wrapped(fragment, namespaces, kind) + return rendered["worksheet"], rendered["window"] + + +def _read_text(path: Path, label: str) -> str: + """Read a UTF-8 file without translating its line endings. + + ``read_text`` would turn every CRLF into a bare LF, which a bounded splice + would then write back as a whole-file rewrite. + """ + try: + return Path(path).read_bytes().decode("utf-8") + except (OSError, UnicodeDecodeError) as error: + raise ResourceError(f"Cannot read {label} {path}: {error}") from error + + +def _parse_workbook(twb_text: str) -> ET.Element: + """Parse workbook text and confirm it has a ```` root.""" + try: + root = ET.fromstring(twb_text) + except ET.ParseError as error: + raise ResourceError(f"Workbook is not well-formed XML: {error}") from error + if root.tag != "workbook": + raise ResourceError( + f"Workbook root element must be , found <{root.tag}>" + ) + return root + + +def _metadata_record_fields(datasource: ET.Element) -> dict[str, FieldMetadata]: + """Return field metadata from ```` entries. + + A record describes a physical column of the connection. Tableau surfaces a + numeric one as a measure and everything else as a dimension, and that + default is the only role a record can imply, so it is the only role + reported here. + + Parsing is defensive and deterministic: a record of another class, one + with no ````, one that names a field without Tableau's + brackets, and a repeat of a name already seen are all skipped, so a + partial or hand-edited connection block cannot redefine a field. + """ + discovered: dict[str, FieldMetadata] = {} + for record in datasource.iter("metadata-record"): + if record.get("class") != METADATA_RECORD_COLUMN_CLASS: + continue + raw = (record.findtext("local-name") or "").strip() + if len(raw) <= 2 or not (raw.startswith("[") and raw.endswith("]")): + continue + name = unescape_bracket(raw[1:-1]) + if name in discovered: + continue + datatype = (record.findtext("local-type") or "").strip() or None + role = None + if datatype is not None: + role = ( + "measure" + if _datatype_family(datatype) == NUMERIC_FAMILY + else "dimension" + ) + # A record carries no separate display type, so the physical type is + # the most this layer can honestly say about both. + discovered[name] = FieldMetadata(datatype, datatype, role) + return discovered + + +def _column_fields(datasource: ET.Element) -> dict[str, FieldMetadata]: + """Return field metadata from explicit ```` declarations.""" + discovered: dict[str, FieldMetadata] = {} + for column in datasource.iter("column"): + name = _bracketed_name(column, "name") + if name is None or name in discovered: + continue + discovered[name] = FieldMetadata( + column.get("datatype"), + column.get("user-datatype"), + column.get("role"), + ) + return discovered + + +def inspect_datasource_metadata(twb_text: str) -> dict[str, DatasourceMetadata]: + """Return each global datasource's caption and field metadata. + + Only datasources declared in the workbook's own ```` container + are reported. A worksheet's per-view ```` block names the same + datasource but carries only the columns that view happens to use, so + including it would let a mapping validate against an incomplete field list. + + A field is discovered from either layer a real workbook may use: an + explicit ```` declaration, or a ```` + entry under the connection. A physical column the author has never + customized appears only as a metadata record, so reading just ```` + would report a workbook's own fields as missing. Where both layers + describe one field the explicit declaration wins, because that is the + logical definition Tableau itself reads. + """ + root = _parse_workbook(twb_text) + container = root.find("datasources") + if container is None: + raise ResourceError("Workbook has no container") + + discovered: dict[str, DatasourceMetadata] = {} + for datasource in container.findall("datasource"): + name = datasource.get("name") or "" + if not name.strip(): + raise ResourceError("Workbook declares a without a name") + if name in discovered: + raise ResourceError( + f"Workbook declares datasource {name} more than once" + ) + fields = _metadata_record_fields(datasource) + fields.update(_column_fields(datasource)) + discovered[name] = DatasourceMetadata( + (datasource.get("caption") or "").strip() or name, fields + ) + return discovered + + +def inspect_datasources(twb_text: str) -> dict[str, set[str]]: + """Return each global datasource's internal name and its field names. + + A thin view over :func:`inspect_datasource_metadata` for callers that only + need to know which fields exist. + """ + return { + name: set(metadata.fields) + for name, metadata in inspect_datasource_metadata(twb_text).items() + } + + +def _validate_target_fields( + datasources: dict[str, DatasourceMetadata], + datasource_name: str, + field_mappings: dict[str, str], +) -> None: + """Confirm the target datasource and every mapped target field exist.""" + if datasource_name not in datasources: + available = ", ".join(sorted(datasources)) or "none" + raise ResourceError( + f"Workbook has no datasource named {datasource_name} " + f"(available: {available})" + ) + fields = datasources[datasource_name].fields + missing = sorted( + {target for target in field_mappings.values() if target not in fields} + ) + if missing: + available = ", ".join(sorted(fields)) or "none" + raise ResourceError( + f"Datasource {datasource_name} has no field named " + f"{', '.join(missing)} (available: {available})" + ) + + +def _validate_mapping_types( + source_types: dict[str, str], + target_fields: dict[str, FieldMetadata], + field_mappings: dict[str, str], +) -> None: + """Reject a mapping whose target field cannot carry the source's data. + + Tableau's datatypes fall into families that behave the same way on a + shelf. Within one family a template survives being repointed: an integer + measure works unchanged against a real, and a date dimension works against + a datetime, because the derivation, the shelf role, and the + nominal/ordinal/quantitative pair all stay valid. Crossing a family + boundary does not survive that way — a Sum of a string, or a date + truncation of a boolean, is not a viz this module can honestly produce — + so it fails here, before anything is rendered. + + A target field whose datatype cannot be determined is equally fatal: + rendering it would have to fall back to the donor's datatype, which is the + defect this check exists to prevent. + """ + problems: list[str] = [] + for source in sorted(field_mappings): + source_datatype = source_types.get(source) + source_family = _datatype_family(source_datatype) + if source_family is None: + # No recorded contract for this field, so there is nothing to + # compare the target against and nothing to assert. + continue + target = field_mappings[source] + metadata = target_fields.get(target) + target_datatype = metadata.datatype if metadata is not None else None + target_family = _datatype_family(target_datatype) + if target_family is None: + problems.append( + f"{source} -> {target} (target field declares no datatype; " + f"{source} is {source_datatype})" + ) + elif target_family != source_family: + problems.append( + f"{source} -> {target} ({source_datatype} is {source_family}, " + f"{target_datatype} is {target_family})" + ) + if problems: + raise ResourceError(f"Incompatible field mappings: {'; '.join(problems)}") + + +def _fragment_name(fragment: str, tag: str) -> str: + """Return the ``name`` attribute of a rendered fragment's root element.""" + data = fragment.encode("utf-8") + opening = f"<{tag}".encode("utf-8") + if not data.startswith(opening) or data[len(opening) : len(opening) + 1] not in ( + b" ", + b"\t", + b"\n", + b"\r", + b">", + b"/", + ): + raise ResourceError(f"Rendered fragment is not a <{tag}> element") + name = _unescape(_tag_attributes(data, 0).get("name") or "") + if not name: + raise ResourceError(f"Rendered <{tag}> fragment has no name attribute") + return name + + +def _closing_tag_offset(data: bytes, tag: str) -> int: + """Return the byte offset of the workbook's single ````.""" + closing = f"".encode("utf-8") + count = data.count(closing) + if count != 1: + detail = ( + f"an empty <{tag} /> container cannot receive a fragment" + if count == 0 and re.search(rf"<{tag}(\s[^<>]*)?/>", data.decode("utf-8")) + else f"found {count}" + ) + raise ResourceError( + f"Workbook must contain exactly one closing tag ({detail})" + ) + return data.index(closing) + + +def _expand_empty_container(text: str, tag: str) -> str: + """Rewrite a self-closing ```` container into an open/close pair. + + Applied only to the bundled starter, whose containers are empty by design. + A caller's workbook is never restructured this way: it must already carry + the container it is being asked to extend. + """ + if f"" in text: + return text + pattern = re.compile( + rf"^([ \t]*)<{tag}((?:\s[^<>]*?)?)\s*/>[ \t]*$", re.MULTILINE + ) + matches = list(pattern.finditer(text)) + if len(matches) != 1: + raise ResourceError( + f"Starter workbook must contain exactly one <{tag}> container, " + f"found {len(matches)}" + ) + match = matches[0] + indent = match.group(1) + replacement = f"{indent}<{tag}{match.group(2).rstrip()}>\n{indent}" + return text[: match.start()] + replacement + text[match.end() :] + + +def _insert_before(data: bytes, offset: int, fragment: str) -> bytes: + """Splice ``fragment`` into ``data`` immediately before ``offset``. + + Every byte before ``offset`` and every byte from ``offset`` onward is + carried over untouched; only the closing tag's own indentation is repeated + after the fragment so the result stays readable. + """ + line_start = data.rfind(b"\n", 0, offset) + 1 + indent = data[line_start:offset] + # The closing tag shares its line with other markup, so start a new line + # for the fragment instead of copying that markup as indentation. + lead, indent = (b"", indent) if not indent.strip() else (b"\n", b"") + return ( + data[:offset] + + lead + + fragment.encode("utf-8") + + b"\n" + + indent + + data[offset:] + ) + + +def inject_fragments(twb_text: str, worksheet: str, window: str) -> str: + """Insert one rendered worksheet/window pair into workbook text. + + Both fragments are placed immediately before the workbook's single + ```` and ```` closing tags. The workbook is parsed + to reject a duplicate worksheet or window name and to confirm the result is + well-formed, but it is never reserialized. + """ + worksheet_name = _fragment_name(worksheet, "worksheet") + window_name = _fragment_name(window, "window") + + root = _parse_workbook(twb_text) + for tag in ("worksheets", "windows"): + if root.find(tag) is None: + raise ResourceError(f"Workbook has no <{tag}> container") + if worksheet_name in { + item.get("name") for item in root.findall("worksheets/worksheet") + }: + raise ResourceError( + f"Workbook already contains a worksheet named {worksheet_name}; " + "choose a different --worksheet-name" + ) + if window_name in {item.get("name") for item in root.findall("windows/window")}: + raise ResourceError( + f"Workbook already contains a window named {window_name}; " + "choose a different --worksheet-name" + ) + + data = twb_text.encode("utf-8") + insertions = sorted( + ( + (_closing_tag_offset(data, "worksheets"), worksheet), + (_closing_tag_offset(data, "windows"), window), + ), + key=lambda insertion: insertion[0], + reverse=True, + ) + for offset, fragment in insertions: + data = _insert_before(data, offset, fragment) + + output = data.decode("utf-8") + written = _parse_workbook(output) + placed_worksheets = [ + item.get("name") for item in written.findall("worksheets/worksheet") + ] + placed_windows = [item.get("name") for item in written.findall("windows/window")] + if ( + placed_worksheets.count(worksheet_name) != 1 + or placed_windows.count(window_name) != 1 + ): + raise ResourceError( + "Injected fragments did not land exactly once in the workbook's " + " and containers" + ) + return output + + +def _bracketed_name(element: ET.Element, attribute: str) -> str | None: + """Return a bracketed identifier attribute's decoded name, if it has one.""" + raw = element.get(attribute) or "" + if len(raw) > 2 and raw.startswith("[") and raw.endswith("]"): + return unescape_bracket(raw[1:-1]) + return None + + +def _defined_fields(element: ET.Element) -> set[str]: + """Return every field name defined beneath ``element``. + + Relation metadata inside a connection names a table's physical columns + without brackets, so requiring brackets keeps physical column names out of + the datasource's field vocabulary. + """ + return { + name + for tag in FIELD_DEFINITION_TAGS + for child in element.iter(tag) + if (name := _bracketed_name(child, "name")) is not None + } + + +def _field_definitions(root: ET.Element) -> dict[str, set[str]]: + """Map each globally declared datasource to the fields it defines. + + Only the workbook's own ```` container declares a datasource. + A worksheet's ```` block names an already-declared + datasource and carries just the columns and column instances that view + uses, so it extends a declared field set and never creates one. + """ + definitions: dict[str, set[str]] = {} + for datasource in root.findall("datasources/datasource"): + name = datasource.get("name") or "" + definitions.setdefault(name, set()).update(_defined_fields(datasource)) + for dependencies in root.iter("datasource-dependencies"): + fields = definitions.get(dependencies.get("datasource") or "") + if fields is not None: + fields.update(_defined_fields(dependencies)) + return definitions + + +def _field_references(root: ET.Element) -> list[tuple[str, str]]: + """Return every ``[datasource].[field]`` pair a view element carries. + + Geographic metadata is skipped: a semantic role and a semantic-value key + are qualified names in Tableau's geocoding hierarchy, not references into + a datasource. A field definition's own attributes are skipped for the same + reason — they describe that field rather than pointing at another one — + while element text and everything nested inside a definition is still + scanned. Names arrive already entity-decoded from the parser, so only + Tableau's bracket escaping is undone. + """ + references: list[tuple[str, str]] = [] + + def collect(text: str) -> None: + references.extend( + (unescape_bracket(datasource), unescape_bracket(field)) + for datasource, field in QUALIFIED_REF_RE.findall(text) + ) + + for container in FIELD_REFERENCE_CONTAINERS: + for parent in root.findall(container): + for element in parent.iter(): + if element.tag not in NON_REFERENCE_TAGS: + for name, value in element.attrib.items(): + if name not in NON_REFERENCE_ATTRIBUTES: + collect(value) + for text in (element.text, element.tail): + if text: + collect(text) + return references + + +def _unresolved_field(defined: set[str], field: str) -> str | None: + """Return the name ``field`` fails to resolve to, or ``None``. + + A column instance that the workbook does not declare still resolves when + its ``derivation:field:role`` base field is defined, so an undeclared + instance of a real field is reported against that base field. + """ + if _is_exempt_field(field) or field in defined: + return None + derived = DERIVED_SEGMENT_RE.match(field) + if derived is None: + return field + base = derived.group(2) + return None if base in defined or _is_exempt_field(base) else base + + +def _repeated(names: list[str]) -> list[str]: + """Return each name that appears more than once, sorted and deduplicated.""" + return sorted({name for name in names if names.count(name) > 1}) + + +def validate_workbook_text(text: str) -> list[str]: + """Return workbook text's structural errors, ordered and deduplicated. + + An empty list means the workbook is structurally sound: it has the three + required containers, carries no unresolved template token or unresolved + ``federated.`` placeholder, names each worksheet and its window once and + consistently, and references only datasources and fields the workbook + itself defines. Errors are reported in a fixed rule order so a caller can + compare two runs, and a malformed or non-workbook document reports only + that, because every later rule would be guessing at its structure. + """ + try: + root = ET.fromstring(text) + except ET.ParseError: + return ["malformed-xml"] + if root.tag != "workbook": + return ["not-tableau-workbook"] + + errors: list[str] = [ + f"missing-{tag}-container" + for tag in REQUIRED_CONTAINERS + if root.find(tag) is None + ] + + if TEMPLATE_TOKEN_RE.search(text): + errors.append("unresolved-template-token") + + definitions = _field_definitions(root) + # A real connection is named "federated.", so a federated token is + # legitimate only when it names one of this workbook's own datasources. + if any( + _unescape(match.group(0)) not in definitions + for match in FEDERATED_RE.finditer(text) + ): + errors.append("unresolved-federated-placeholder") + + worksheet_names = [ + item.get("name") or "" for item in root.findall("worksheets/worksheet") + ] + windows = root.findall("windows/window") + errors.extend( + f"duplicate-worksheet-name: {name}" for name in _repeated(worksheet_names) + ) + errors.extend( + f"duplicate-window-name: {name}" + for name in _repeated([item.get("name") or "" for item in windows]) + ) + # Dashboard and story windows have no worksheet of their own, so only + # worksheet-class windows are paired. + worksheet_windows = { + item.get("name") or "" for item in windows if item.get("class") == "worksheet" + } + errors.extend( + f"worksheet-window-name-mismatch: {name}" + for name in sorted(set(worksheet_names) ^ worksheet_windows) + ) + + unknown_datasources: set[str] = set() + unknown_fields: set[str] = set() + for datasource, field in _field_references(root): + if datasource not in definitions: + unknown_datasources.add(datasource) + continue + unresolved = _unresolved_field(definitions[datasource], field) + if unresolved is not None: + unknown_fields.add(f"{datasource}.{unresolved}") + errors.extend( + f"unknown-datasource-reference: {name}" + for name in sorted(unknown_datasources) + ) + errors.extend( + f"unknown-field-reference: {name}" for name in sorted(unknown_fields) + ) + + return list(dict.fromkeys(errors)) + + +def validate_workbook(path: Path) -> list[str]: + """Return the structural errors of the workbook stored at ``path``.""" + return validate_workbook_text(_read_text(Path(path), "workbook")) + + +def _read_datasource_definition(path: Path) -> tuple[str, str]: + """Return one ```` element's text and its internal name.""" + path = Path(path) + text = _read_text(path, "datasource definition") + try: + root = ET.fromstring(text) + except ET.ParseError as error: + raise ResourceError( + f"Datasource definition {path} is not well-formed XML: {error}" + ) from error + if root.tag != "datasource": + raise ResourceError( + f"Datasource definition must be exactly one element, " + f"found <{root.tag}>" + ) + if root.findall(".//datasource"): + raise ResourceError( + "Datasource definition must contain exactly one element, " + "found nested datasources" + ) + name = root.get("name") or "" + if not name.strip(): + raise ResourceError( + "Datasource definition must declare a nonempty name attribute" + ) + + data = text.encode("utf-8") + spans = [ + (start, end) + for tag, depth, start, end in _scan_elements(data) + if depth == 0 and tag == "datasource" + ] + if len(spans) != 1: + raise ResourceError( + "Datasource definition must contain exactly one element" + ) + start, end = spans[0] + return data[start:end].decode("utf-8"), name + + +def _reject_introduced_errors(baseline_text: str, output: str) -> None: + """Block validation errors this run introduced, ignoring inherited ones. + + Validation is a delta against a baseline, not an absolute gate: a workbook + that already fails a rule — a hidden sheet with no window, a reference + this module cannot resolve — is the caller's to fix, and refusing to + extend it would make this CLI unusable against real workbooks it did not + create. What this run must never do is make the workbook worse, so any + error the output has and the baseline did not is fatal. + + The baseline is only the document this run inherited unchanged. Anything + this run puts into the output — the rendered sheet, and for ``instantiate`` + the caller's inserted ```` definition — is generated content + and is held to the full rules, so a definition carrying an unresolved + token cannot license that token in the result. Inherited errors are + reported alongside the fatal ones so a reader can tell which came from + where. + """ + baseline = validate_workbook_text(baseline_text) + inherited = set(baseline) + introduced = [ + error for error in validate_workbook_text(output) if error not in inherited + ] + if not introduced: + return + detail = f"Generated workbook failed validation: {', '.join(introduced)}" + if baseline: + detail += ( + " (pre-existing errors carried in from the input workbook: " + f"{', '.join(baseline)})" + ) + raise ResourceError(detail) + + +def _apply_resource( + twb_text: str, + *, + plugin_root: Path, + resource_id: str, + worksheet_name: str, + datasource_name: str, + field_mappings: dict[str, str] | None, + parameters: dict[str, str] | None, + baseline_text: str | None = None, +) -> str: + """Validate mappings against the workbook, render, inject, and verify. + + The transformed workbook is returned only after it introduces no new + validation error, so a caller never writes a workbook this run made worse. + + ``baseline_text`` is the document whose existing errors are inherited. It + defaults to ``twb_text``, which is correct when the caller supplied that + whole workbook. A caller that assembled ``twb_text`` itself must pass the + part it did not generate, so the part it did generate is still checked. + """ + mappings = dict(field_mappings or {}) + datasources = inspect_datasource_metadata(twb_text) + _validate_target_fields(datasources, datasource_name, mappings) + target = datasources[datasource_name] + worksheet, window = render_bookmark( + plugin_root, + resource_id, + worksheet_name, + datasource_name, + mappings, + dict(parameters or {}), + datasource_caption=target.caption, + target_fields=target.fields, + ) + output = inject_fragments(twb_text, worksheet, window) + _reject_introduced_errors( + twb_text if baseline_text is None else baseline_text, output + ) + return output + + +def _default_file_mode() -> int: + current = os.umask(0) + os.umask(current) + return 0o666 & ~current + + +def atomic_write(path: Path, content: str, overwrite: bool = False) -> None: + """Write ``content`` to ``path`` through a same-directory temporary file. + + The destination is only ever replaced by a fully written, fsynced file, so + an interrupted run cannot leave a partial workbook behind. + """ + path = Path(path) + if path.exists() and not overwrite: + raise ResourceError( + f"Refusing to replace existing file {path}; pass --overwrite to allow it" + ) + directory = path.parent + if not directory.is_dir(): + raise ResourceError(f"Output directory does not exist: {directory}") + + # A temporary file is created 0600, so replacing an existing workbook would + # otherwise silently narrow its permissions. + mode = path.stat().st_mode & 0o7777 if path.exists() else _default_file_mode() + + try: + handle = tempfile.NamedTemporaryFile( + "w", + encoding="utf-8", + newline="", + dir=directory, + prefix=f".{path.name}.", + suffix=".tmp", + delete=False, + ) + except OSError as error: + raise ResourceError(f"Cannot write {path}: {error}") from error + + temporary = Path(handle.name) + try: + with handle: + handle.write(content) + handle.flush() + os.fsync(handle.fileno()) + os.chmod(temporary, mode) + os.replace(temporary, path) + except OSError as error: + temporary.unlink(missing_ok=True) + raise ResourceError(f"Cannot write {path}: {error}") from error + except BaseException: + temporary.unlink(missing_ok=True) + raise + + +def _check_output_path( + source_path: Path, output_path: Path, overwrite: bool, label: str +) -> None: + if source_path.resolve() == output_path.resolve() and not overwrite: + raise ResourceError( + f"Output path {output_path} is the {label}; pass --overwrite to " + "replace it or choose a different --output" + ) + + +def inject_resource( + *, + input_path: Path, + output_path: Path, + resource_id: str, + worksheet_name: str, + datasource_name: str, + field_mappings: dict[str, str] | None = None, + parameters: dict[str, str] | None = None, + plugin_root: Path = PLUGIN_ROOT, + overwrite: bool = False, +) -> str: + """Add one executable resource to an existing workbook. + + Returns the complete transformed workbook text, which is also written to + ``output_path``. The input file is only read, never modified, unless the + caller points ``output_path`` at it with ``overwrite``. + """ + input_path = Path(input_path) + output_path = Path(output_path) + _check_output_path(input_path, output_path, overwrite, "input workbook") + twb_text = _read_text(input_path, "workbook") + + output = _apply_resource( + twb_text, + plugin_root=plugin_root, + resource_id=resource_id, + worksheet_name=worksheet_name, + datasource_name=datasource_name, + field_mappings=field_mappings, + parameters=parameters, + ) + atomic_write(output_path, output, overwrite=overwrite) + return output + + +def instantiate_resource( + *, + datasource_definition_path: Path, + output_path: Path, + resource_id: str, + worksheet_name: str, + field_mappings: dict[str, str] | None = None, + parameters: dict[str, str] | None = None, + plugin_root: Path = PLUGIN_ROOT, + overwrite: bool = False, +) -> str: + """Create a workbook from the starter, one datasource, and one resource. + + The caller supplies the complete ```` definition; connection + metadata is never fabricated. Returns the complete workbook text, which is + also written to ``output_path``. + + Every part of the result other than the bundled starter is produced by + this call, so the starter alone is the validation baseline and a supplied + definition carrying an unresolved token or a stray federated placeholder + fails the run instead of being inherited. + """ + plugin_root = Path(plugin_root) + output_path = Path(output_path) + _check_output_path( + Path(datasource_definition_path), + output_path, + overwrite, + "datasource definition", + ) + definition, datasource_name = _read_datasource_definition( + datasource_definition_path + ) + + starter_path = plugin_root / "resources" / STARTER_RELATIVE_PATH + starter_text = _read_text(starter_path, "starter workbook") + + twb_text = starter_text + for tag in ("datasources", "worksheets", "windows"): + twb_text = _expand_empty_container(twb_text, tag) + data = twb_text.encode("utf-8") + twb_text = _insert_before( + data, _closing_tag_offset(data, "datasources"), definition + ).decode("utf-8") + + output = _apply_resource( + twb_text, + plugin_root=plugin_root, + resource_id=resource_id, + worksheet_name=worksheet_name, + datasource_name=datasource_name, + field_mappings=field_mappings, + parameters=parameters, + baseline_text=starter_text, + ) + atomic_write(output_path, output, overwrite=overwrite) + return output + + +def _print_json(data: object) -> None: + print(json.dumps(data, indent=2)) + + +def _format_list_text(entries: list[dict[str, object]]) -> str: + if not entries: + return "No resources found." + lines = [] + for entry in entries: + family = entry.get("family") or "-" + lines.append( + f"{entry['id']} [{entry['type']}/{entry['tier']}] " + f"family={family} — {entry.get('intent') or ''}" + ) + return "\n".join(lines) + + +def _format_inspect_text(entry: dict[str, object]) -> str: + lines = [ + f"id: {entry['id']}", + f"type: {entry['type']}", + f"tier: {entry['tier']}", + f"family: {entry.get('family') or '-'}", + f"intent: {entry.get('intent') or '-'}", + f"path: {entry['path']}", + ] + datasources = entry.get("datasources") or [] + lines.append(f"datasources: {', '.join(datasources) if datasources else '-'}") + parameters = entry.get("parameters") or [] + if parameters: + lines.append("parameters:") + for parameter in parameters: + required = parameter.get("required", True) + details = [ + str(parameter.get("type") or "untyped"), + "required" if required else "optional", + ] + allowed = parameter.get("allowed") or [] + if allowed: + details.append(f"allowed: {', '.join(allowed)}") + lines.append(f" - {parameter.get('name')} ({', '.join(details)})") + else: + lines.append("parameters: -") + fields = entry.get("fields") or [] + if fields: + lines.append("fields:") + for field in fields: + lines.append( + f" - {field['sourceField']} ({field['shelf']}, " + f"{field['role']}, {field['derivation']}, {field['datatype']})" + ) + lines.append( + " each field must map to a target field of the same datatype " + "family (integer/real, date/datetime, string, boolean, spatial)" + ) + else: + lines.append("fields: -") + reasons = entry.get("classificationReasons") or [] + if reasons: + lines.append(f"classificationReasons: {', '.join(reasons)}") + return "\n".join(lines) + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + description="Discover and inspect Tableau plugin resources.", + ) + subparsers = parser.add_subparsers(dest="command", required=True) + + list_parser = subparsers.add_parser( + "list", help="List catalog resources, optionally filtered." + ) + list_parser.add_argument("--query", help="Free-text search over id/intent/family/keywords.") + list_parser.add_argument("--family", help="Exact-match resource family filter.") + list_parser.add_argument("--type", dest="resource_type", help="Exact-match resource type filter.") + list_parser.add_argument("--tier", help="Exact-match resource tier filter.") + list_parser.add_argument( + "--format", choices=("json", "text"), default="json", help="Output format." + ) + + inspect_parser = subparsers.add_parser( + "inspect", help="Show the full catalog entry for one resource id." + ) + inspect_parser.add_argument("resource_id", help="Resource id to inspect.") + inspect_parser.add_argument( + "--format", choices=("json", "text"), default="json", help="Output format." + ) + + instantiate_parser = subparsers.add_parser( + "instantiate", + help="Create a workbook from the starter, one datasource, and one resource.", + ) + instantiate_parser.add_argument("resource_id", help="Executable resource id.") + instantiate_parser.add_argument( + "--datasource-definition", + required=True, + help="Path to a file holding exactly one element.", + ) + _add_transform_arguments(instantiate_parser) + + inject_parser = subparsers.add_parser( + "inject", help="Add one executable resource to an existing workbook." + ) + inject_parser.add_argument("resource_id", help="Executable resource id.") + inject_parser.add_argument( + "--input", required=True, help="Path to the existing .twb workbook." + ) + inject_parser.add_argument( + "--datasource", + required=True, + help="Internal name of the target datasource in the input workbook.", + ) + _add_transform_arguments(inject_parser) + + validate_parser = subparsers.add_parser( + "validate", help="Report a workbook's structural errors." + ) + validate_parser.add_argument( + "--input", required=True, help="Path to the .twb workbook to check." + ) + + return parser + + +def _add_transform_arguments(parser: argparse.ArgumentParser) -> None: + parser.add_argument("--output", required=True, help="Path to the output .twb.") + parser.add_argument( + "--worksheet-name", required=True, help="Name for the generated worksheet." + ) + parser.add_argument( + "--map", + dest="maps", + action="append", + default=[], + metavar="SOURCE=TARGET", + help="Map one template source field to a target datasource field.", + ) + parser.add_argument( + "--param", + dest="params", + action="append", + default=[], + metavar="NAME=VALUE", + help="Supply one template parameter value.", + ) + parser.add_argument( + "--overwrite", + action="store_true", + help="Allow replacing an existing output file.", + ) + + +def main(argv: list[str] | None = None) -> int: + parser = build_parser() + args = parser.parse_args(argv) + + plugin_root = PLUGIN_ROOT + + if args.command == "list": + results = search_resources( + load_catalog(plugin_root), + query=args.query, + family=args.family, + resource_type=args.resource_type, + tier=args.tier, + ) + if args.format == "text": + print(_format_list_text(results)) + else: + _print_json(results) + return 0 + + if args.command == "inspect": + try: + entry = find_resource(load_catalog(plugin_root), args.resource_id) + except KeyError: + print(f"Unknown resource: {args.resource_id}", file=sys.stderr) + return 2 + if args.format == "text": + print(_format_inspect_text(entry)) + else: + _print_json(entry) + return 0 + + if args.command == "validate": + try: + errors = validate_workbook(Path(args.input)) + except ResourceError as error: + print(str(error), file=sys.stderr) + return 2 + # stdout is always the JSON error list, so a caller can read the same + # shape whether or not the workbook passed. + _print_json(errors) + return 1 if errors else 0 + + if args.command in ("instantiate", "inject"): + try: + field_mappings = parse_assignments(args.maps) + parameters = parse_assignments(args.params) + if args.command == "inject": + inject_resource( + input_path=Path(args.input), + output_path=Path(args.output), + resource_id=args.resource_id, + worksheet_name=args.worksheet_name, + datasource_name=args.datasource, + field_mappings=field_mappings, + parameters=parameters, + plugin_root=plugin_root, + overwrite=args.overwrite, + ) + else: + instantiate_resource( + datasource_definition_path=Path(args.datasource_definition), + output_path=Path(args.output), + resource_id=args.resource_id, + worksheet_name=args.worksheet_name, + field_mappings=field_mappings, + parameters=parameters, + plugin_root=plugin_root, + overwrite=args.overwrite, + ) + except ResourceError as error: + print(str(error), file=sys.stderr) + return 2 + print(f"Wrote {args.output}") + return 0 + + parser.error(f"Unknown command: {args.command}") + return 2 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/plugins/tableau/skills/tableau-pulse-insights/SKILL.md b/plugins/tableau/skills/tableau-pulse-insights/SKILL.md new file mode 100644 index 0000000..4c75cd1 --- /dev/null +++ b/plugins/tableau/skills/tableau-pulse-insights/SKILL.md @@ -0,0 +1,37 @@ +--- +name: tableau-pulse-insights +description: Use when building Tableau Pulse Insights bar or line visualizations in a .twb workbook, including ARR trends, ranked products, date ranges, and field mapping. +--- + +# Tableau Pulse Insights + +## Overview + +Pulse Insights is the `pulse-insights` catalog family: two executable +bookmark templates for the bar and line shapes Pulse surfaces most often — +a ranked-product bar chart and an ARR-over-time trend line. + +## Workflow + +Start discovery scoped to the family (the CLI path below is relative to +this skill's own directory, `skills/tableau-pulse-insights/`): + +```bash +python3 ../../scripts/tableau_resources.py list \ + --family pulse-insights \ + --tier executable +``` + +This returns exactly `insights__bar_chart` (rank products by a measure +within a date range) and `insights__line_chart` (a measure trending over a +date field). Pick the one matching the ask, `inspect` it, then follow +`tableau-workbook-authoring` for the field-mapping, parameter, transform +(`instantiate`/`inject`), and validate/publish steps — that skill and the +shared CLI own those rules; this skill does not repeat them. + +## Common mistakes + +- Searching without `--family pulse-insights` and picking an unrelated bar + or line template from another family. +- Re-deriving mapping or validation rules here instead of following + `tableau-workbook-authoring`. diff --git a/plugins/tableau/skills/tableau-workbook-authoring/SKILL.md b/plugins/tableau/skills/tableau-workbook-authoring/SKILL.md new file mode 100644 index 0000000..18c1bf7 --- /dev/null +++ b/plugins/tableau/skills/tableau-workbook-authoring/SKILL.md @@ -0,0 +1,74 @@ +--- +name: tableau-workbook-authoring +description: Use when creating, modifying, templating, validating, or publishing Tableau .twb workbooks, including selecting visualization samples and mapping fields into Tableau bookmark templates. +--- + +# Tableau Workbook Authoring + +## Overview + +The plugin ships a resource catalog (chart templates, worked examples, a +reference corpus) and a CLI, `../../scripts/tableau_resources.py` — +relative to this skill's own directory, `skills/tableau-workbook-authoring/` +— that discovers, inspects, and safely transforms `.twb` workbooks. This +skill is the required entry point for any workbook build, edit, or publish +that touches those resources. + +## Workflow + +1. Inspect the existing workbook (or prepare a `` definition + file for a fresh one). +2. Run `list` before choosing a chart — never guess a resource id. +3. Run `inspect` before mapping fields — it returns the required field, + parameter, and datasource contract for that resource. Each `--map` must + point at a target field of the same datatype family; see the resource + guide's *Datatype compatibility* section. +4. Transform: `inject` adds a resource into an existing workbook; + `instantiate` builds a new workbook from the bundled starter. +5. Treat `tier: reference` resources (examples, corpus entries, schema docs) + as inspiration only. Only `tier: executable` resources are accepted by + `instantiate`/`inject`; the CLI rejects the rest. +6. Run `validate` on the transformed workbook — an absolute structural + check of that whole file (exit 0 clean, 1 lists errors, 2 means the + command itself could not read or validate it). +7. Run the `validate-workbook-package` skill — the pre-publish gate. +8. Publish only with the validation receipt that gate returns. + +## Quick reference + +```bash +python3 ../../scripts/tableau_resources.py list --tier executable --query "" +python3 ../../scripts/tableau_resources.py inspect +python3 ../../scripts/tableau_resources.py instantiate \ + --datasource-definition --output --worksheet-name \ + --map SOURCE=TARGET --param NAME=VALUE +python3 ../../scripts/tableau_resources.py inject \ + --input --output --datasource \ + --worksheet-name --map SOURCE=TARGET --param NAME=VALUE +python3 ../../scripts/tableau_resources.py validate --input +``` + +## Common mistakes + +- Skipping `list`/`inspect` and guessing a resource id or field mapping — + `inject`/`instantiate` fail closed on any unknown or missing mapping. +- Passing a `reference`-tier resource to `inject`/`instantiate` — it is not + renderable; use it only as inspiration for a hand-authored viz. +- Treating local `validate` as sufficient for publishing — it is an + **absolute** structural check on the file you pass it, not the + pre-publish gate. (Delta tolerance — letting a workbook's pre-existing + errors pass through — is internal to `inject`'s own pre-write check; + `instantiate` checks its output against the clean bundled starter. The + standalone `validate` command never tolerates anything.) Always run + `validate-workbook-package` before `create-and-publish-workbook`. +- Assuming `inject`'s `--datasource` accepts a display caption — it is the + target datasource's internal `name` attribute from the input workbook's + own `` container. A wrong value fails closed and lists + every available name. +- Running a command after changing directories without first resolving + `../../scripts/tableau_resources.py` to an absolute path — that path is + relative to this skill's own directory, not to your current shell + location. + +Detailed CLI flags, mapping/parameter syntax, and failure recovery: +references/resource-guide.md. diff --git a/plugins/tableau/skills/tableau-workbook-authoring/references/resource-guide.md b/plugins/tableau/skills/tableau-workbook-authoring/references/resource-guide.md new file mode 100644 index 0000000..136e9d1 --- /dev/null +++ b/plugins/tableau/skills/tableau-workbook-authoring/references/resource-guide.md @@ -0,0 +1,220 @@ +# Resource Guide + +Detailed reference for `../../scripts/tableau_resources.py`. Read this when +the quick reference in SKILL.md is not enough — full flag lists, mapping +syntax, worked examples, and how to recover from each failure mode. + +Every command below repeats the same path used in SKILL.md, +`../../scripts/tableau_resources.py`. That path is relative to **this +skill's own directory** (`skills/tableau-workbook-authoring/`, where +SKILL.md lives) — not to this `references/` file, which sits one level +deeper. Resolve the script to an absolute path once, from the skill +directory, before running any command that changes your working +directory; do not re-derive the relative path from wherever your shell +happens to be. + +## Catalog shape + +Every entry in `resources/catalog.json` has: + +- `id` — stable identifier, e.g. `insights__bar_chart`. +- `type` — `template`, `example`, `reference`, or `starter`. +- `tier` — `executable` (renderable via `instantiate`/`inject`) or + `reference` (inspiration only — corpus entries, worked examples, schema + docs). Passing a `reference`-tier id to `instantiate`/`inject` fails + closed with "is reference-only and cannot be rendered". +- `family` — grouping such as `pulse-insights`, `magnitude`, + `change-over-time`, `distribution`, `ranking`, `deviation`, `correlation`, + `flow`, `part-to-whole`, `spatial`, or `null` for ungrouped resources. +- `datasources` — the donor datasource name(s) a template's bookmark + references. `instantiate`/`inject` renders against a single donor. +- `fields` — the donor fields a template places on a shelf + (`sourceField`, `role`, `derivation`, `shelf`). These are the field + mappings `--map` must satisfy. +- `parameters` — typed contracts (`date`, `enum`, `number`, `string`) for + every `{{PARAMETER}}` token the bookmark declares. `--param` must satisfy + every `required: true` entry. + +## `list` — discover before choosing + +```bash +python3 ../../scripts/tableau_resources.py list \ + --query "rank products by revenue" \ + --family pulse-insights \ + --type template \ + --tier executable \ + --format text +``` + +All filters are optional and exact-match except `--query`, which tokenizes +and matches against id, intent, family, and keywords. Omit `--tier` to see +reference material too, but never pass a reference-tier id to a transform +command. + +## `inspect` — read the contract before mapping + +```bash +python3 ../../scripts/tableau_resources.py inspect insights__bar_chart --format text +``` + +Returns the full catalog entry: donor datasource, every source field with +its shelf/role/derivation/datatype, and every parameter's type (and `allowed` +values for `enum`). Use this output to build the `--map` and `--param` +arguments — never invent a field name or parameter value from memory. + +## Datatype compatibility + +A `--map` may only point a source field at a target field in the same +datatype family: + +| Family | Tableau datatypes | +| --- | --- | +| numeric | `integer`, `real` | +| temporal | `date`, `datetime` | +| string | `string` | +| boolean | `boolean` | +| spatial | `spatial` | + +Within a family the template survives being repointed — the derivation, the +shelf role, and the mark type stay valid — so only the declared type changes. +Across a family boundary it does not, so the mapping is refused before +anything is written. The datatype each source field expects is the last item +in `inspect`'s `fields` list. + +The rendered worksheet declares each mapped field with the *target's* own +datatype and role, read from the target datasource's `` declaration +or, when it has none, from its `` entry. A target field +whose datatype cannot be determined from either is refused rather than +guessed. + +## `--map` / `--param` syntax + +Both flags are repeatable — pass one per field or parameter: + +```bash +--map SOURCE=TARGET --map "Close Date"="Order Date" --param NAME=VALUE +``` + +- Each occurrence is exactly one `NAME=VALUE` pair, split on the *first* + `=` (so a value containing its own `=` is fine). +- Leading/trailing whitespace around both `NAME` and `VALUE` is stripped. +- Neither `NAME` nor `VALUE` may be blank after stripping. +- The same `NAME` cannot appear twice across repeated `--map` (or + `--param`) flags — a duplicate name fails closed rather than silently + keeping the last value. + +## `instantiate` — new workbook from the starter + +```bash +python3 ../../scripts/tableau_resources.py instantiate insights__bar_chart \ + --datasource-definition ./my-datasource.xml \ + --output ./workbook.twb \ + --worksheet-name "ARR by Product" \ + --map ARR=Revenue \ + --map "Close Date"="Order Date" \ + --map Product=Product \ + --param DATE_MIN=2024-01-01 \ + --param DATE_MAX=2024-12-31 \ + --param DIRECTION=DESC +``` + +- `--datasource-definition` must be a file containing exactly one + `` element with a nonempty `name` attribute; that name becomes + the workbook's target datasource. +- `--map SOURCE=TARGET` maps one donor field (from `inspect`'s `fields`) to + a field name in your datasource. Supply one `--map` per required field; + an unknown or missing mapping fails closed. +- `--param NAME=VALUE` supplies one declared parameter. Dates must be + ISO-8601 (`YYYY-MM-DD`); enums must be one of the `allowed` values. +- Validation for `instantiate` runs against the *clean bundled starter* as + its baseline. The starter has no pre-existing errors, so there is + nothing to tolerate: every error in the output is your responsibility. + This is not a delta check (see `inject`, below) — it behaves like an + absolute check because the baseline is always clean. + +## `inject` — add to an existing workbook + +```bash +python3 ../../scripts/tableau_resources.py inject insights__line_chart \ + --input ./workbook.twb \ + --output ./workbook-with-trend.twb \ + --datasource "Sample - Superstore" \ + --worksheet-name "ARR Trend" \ + --map ARR=ARR \ + --map "Close Date"="Close Date" +``` + +- `--output` is a **distinct path** here on purpose: a failed run never + touches the input workbook. Writing back to the same path as `--input` + is a deliberate, explicit exception — it requires `--overwrite` so that + in-place replacement is opt-in rather than the default, e.g. + `--output ./workbook.twb --overwrite`. +- `--datasource` is the *internal* `name` attribute of a `` + element in the input workbook's own `` container — not + necessarily its on-screen caption. Open the workbook's XML to confirm + the name if you are unsure. A name the workbook does not have fails + closed: `Workbook has no datasource named (available: )`, so you can retry with a value from that list instead of + guessing. +- Validation for `inject` is a **delta** against the input workbook's own + pre-existing errors: an inherited error (for example a hidden sheet with + no window) does not block the run, but any *new* error the injected + content introduces does. This delta behavior is specific to `inject`; + the standalone `validate` command below never grants this tolerance. +- `--worksheet-name` must be unique in the workbook; a collision fails + closed rather than silently renaming. +- Pass `--overwrite` only when you intend to replace the input file itself, + or an existing output file. + +## `validate` — read the errors, don't guess + +```bash +python3 ../../scripts/tableau_resources.py validate --input ./workbook.twb +``` + +This standalone command is an **absolute** structural check on the whole +file you point it at: it reports every error the workbook has, with no +tolerance for pre-existing problems. (Delta tolerance is internal to +`inject`'s own pre-write check, above; `instantiate`'s check has nothing +to tolerate because its baseline is the clean bundled starter.) + +- Exit code `0` with `[]` means no structural errors. +- Exit code `1` prints a JSON list of stable error codes, in this fixed + order: `malformed-xml`, `not-tableau-workbook`, `missing-*-container`, + `unresolved-template-token`, `unresolved-federated-placeholder`, + `duplicate-worksheet-name: `, `duplicate-window-name: `, + `worksheet-window-name-mismatch: `, + `unknown-datasource-reference: `, + `unknown-field-reference: .`. +- Exit code `2` means the command itself failed operationally, before or + instead of producing that list — for example `--input` does not exist, + is not readable, or is not valid UTF-8. The error text goes to stderr + instead of stdout, and there is no JSON list to parse. + +Local `validate` is not the pre-publish gate. Always follow it with the +`validate-workbook-package` skill before calling +`create-and-publish-workbook`. + +## Failure recovery + +| Error | Cause | Fix | +|---|---|---| +| `Resource is reference-only and cannot be rendered` | Passed a `reference`-tier id to `instantiate`/`inject` | Use `list --tier executable` to find a renderable id, or treat the resource purely as inspiration | +| `Unknown field mappings: ...` | `--map` names a field not in the resource's `fields`/metadata list | Re-run `inspect` and map only the listed source fields | +| `Missing field mappings: ...` | A required source field has no `--map` | Add the missing `--map SOURCE=TARGET` | +| `Missing parameters: ...` / `Unknown parameters: ...` | `--param` doesn't match the resource's typed contract | Re-run `inspect` for exact names, types, and `allowed` values | +| `Parameter must be an ISO-8601 date...` | Bad date format | Use `YYYY-MM-DD` | +| `Datasource has no field named ...` | `--map` target field doesn't exist in the workbook's/definition's datasource | Fix the datasource definition or choose an existing field | +| `Incompatible field mappings: ...` | A `--map` crosses a datatype family, or its target field declares no datatype | Map the source field to a target field of the same family (see *Datatype compatibility*), or declare the target field's `datatype` | +| `Workbook already contains a worksheet/window named ` | `--worksheet-name` collides with an existing one | Choose a different `--worksheet-name` | +| `Generated workbook failed validation: ...` | The transform would introduce a new structural error | Read the listed error codes; for `inject`, only *new* errors block, so check the message's "pre-existing errors" list to see what was already broken | +| `Refusing to replace existing file ...` | `--output` exists and `--overwrite` was omitted | Pass `--overwrite` or choose a different `--output` | + +## Reference-only resources are inspiration, not input + +Resources with `tier: reference` — worked examples in `resources/examples/`, +the corpus and schema references in `resources/references/`, and any +`reference/*.tbm` template — describe patterns to study when designing a +viz by hand. They are never valid arguments to `instantiate`/`inject`, and +the CLI enforces this: attempting to render one raises `ResourceError` +before touching any file. diff --git a/plugins/tableau/skills/validate-workbook-package/SKILL.md b/plugins/tableau/skills/validate-workbook-package/SKILL.md index 3a53935..f469402 100644 --- a/plugins/tableau/skills/validate-workbook-package/SKILL.md +++ b/plugins/tableau/skills/validate-workbook-package/SKILL.md @@ -7,6 +7,13 @@ description: Pre-flight a data-app workspace into a .twbx receipt. Use after aut Call `validate-workbook-package` after `scaffold-data-app` / `upsert-data-app-files` and **before** `create-and-publish-workbook`. It packages in memory and does not publish. +**Prerequisite:** if the workbook was built or edited from the resource +catalog (see `tableau-workbook-authoring`), run the local +`../../scripts/tableau_resources.py validate --input ` check first and +resolve any reported errors. That command is an absolute structural check +on the whole file — unlike the delta check `inject` performs internally +before writing — and it does not replace this pre-publish gate. + ## Invoke - `appId` — workspace handle from scaffold diff --git a/plugins/tableau/tests/fixtures/existing-workbook.twb b/plugins/tableau/tests/fixtures/existing-workbook.twb new file mode 100644 index 0000000..696a8c2 --- /dev/null +++ b/plugins/tableau/tests/fixtures/existing-workbook.twb @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + [Sales Data].[none:Offering:nk] + [Sales Data].[sum:Revenue:qk] +
+ diff --git a/plugins/tableau/tests/fixtures/map-workbook.twb b/plugins/tableau/tests/fixtures/map-workbook.twb new file mode 100644 index 0000000..eb9f7a8 --- /dev/null +++ b/plugins/tableau/tests/fixtures/map-workbook.twb @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ", + ) + with self.assertRaisesRegex(ResourceError, "still references the donor"): + self.render_synthetic(broken) + + def test_a_target_caption_equal_to_the_donor_is_allowed(self) -> None: + """A target may legitimately be captioned after the donor itself. + + The caption is display text, not an address, so it is not residue. + """ + worksheet, _ = self.render_synthetic( + SYNTHETIC_BOOKMARK, datasource_caption="Donor DS" + ) + self.assertIn("caption='Donor DS'", worksheet) + self.assertIn("name='Sales Data'", worksheet) + self.assertIn("[Sales Data].[none:Offering:nk]", worksheet) + + def test_a_target_caption_containing_the_donor_is_allowed(self) -> None: + worksheet, _ = self.render_synthetic( + SYNTHETIC_BOOKMARK, datasource_caption="Donor DS Rollup (EMEA)" + ) + self.assertIn("caption='Donor DS Rollup (EMEA)'", worksheet) + self.assertIn("[Sales Data].[sum:Revenue:qk]", worksheet) + + def test_donor_text_elsewhere_is_rejected_even_with_a_matching_caption( + self, + ) -> None: + """Exempting the caption must not exempt donor text anywhere else.""" + broken = SYNTHETIC_BOOKMARK.replace( + "", + ) + with self.assertRaisesRegex(ResourceError, "still references the donor"): + self.render_synthetic(broken, datasource_caption="Donor DS") + + def test_a_donor_caption_on_another_element_is_still_rejected(self) -> None: + """Only a caption holding the target's own label is exempt.""" + broken = SYNTHETIC_BOOKMARK.replace( + "", + "", + ) + with self.assertRaisesRegex(ResourceError, "still references the donor"): + self.render_synthetic(broken, datasource_caption="Donor DS") + + def test_duplicate_simple_id_in_one_fragment_is_rejected(self) -> None: + broken = SYNTHETIC_BOOKMARK.replace( + "", + "\n" + " ", + ) + with self.assertRaisesRegex(ResourceError, "more than one "): + self.render_synthetic(broken) + + def test_unreplaced_template_token_is_rejected(self) -> None: + broken = SYNTHETIC_BOOKMARK.replace( + "", + "", + ) + with self.assertRaisesRegex(ResourceError, "unresolved template token"): + self.render_synthetic(broken) + + def test_federated_placeholder_is_rejected(self) -> None: + broken = SYNTHETIC_BOOKMARK.replace( + "", + "", + ) + with self.assertRaisesRegex(ResourceError, "federated"): + self.render_synthetic(broken) + + def test_federated_target_datasource_is_accepted(self) -> None: + worksheet, window = self.render_synthetic( + SYNTHETIC_BOOKMARK, datasource_name="federated.0abc123def" + ) + self.assertIn("[federated.0abc123def].[none:Offering:nk]", worksheet) + self.assertNotIn("Donor DS", worksheet + window) + + def test_foreign_federated_reference_is_rejected_for_a_federated_target( + self, + ) -> None: + broken = SYNTHETIC_BOOKMARK.replace( + "", + "", + ) + with self.assertRaisesRegex(ResourceError, "federated.0x1y2z"): + self.render_synthetic(broken, datasource_name="federated.0abc123def") + + +class DonorMetadataReferenceTest(unittest.TestCase): + """Fix round 1, finding 1: unqualified donor metadata must not survive. + + Six executable templates carry ``aggregate-role-from='[State/Province]'``, + a donor column named without a datasource qualifier. It must be mappable, + and dropped rather than emitted when the caller omits it. + """ + + affected = ( + "change-over-time-area-chart", + "change-over-time-stacked-area-chart", + "magnitude-paired-bar", + "magnitude-paired-column-chart", + "part-to-whole-pie-chart", + "part-to-whole-stacked-bar-chart", + ) + primary = "magnitude-paired-bar" + primary_mappings = { + "Customer Name": "Offering", + "Order Date": "Transaction Date", + "Profit": "Revenue", + } + + def render( + self, + resource_id: str, + mappings: dict[str, str] | None = None, + **extra: str, + ) -> tuple[str, str]: + entry = next( + item + for item in load_catalog(PLUGIN)["resources"] + if item["id"] == resource_id + ) + mapped = dict( + mappings + if mappings is not None + else { + field["sourceField"]: field["sourceField"] + for field in entry["fields"] + } + ) + mapped.update(extra) + return render_bookmark( + plugin_root=PLUGIN, + resource_id=resource_id, + worksheet_name=f"Sheet {resource_id}", + datasource_name="Sales Data", + field_mappings=mapped, + parameters={}, + ) + + def test_metadata_only_field_accepts_a_mapping_and_is_rewritten(self) -> None: + worksheet, window = self.render( + self.primary, self.primary_mappings, **{"State/Province": "Offering"} + ) + self.assertIn("aggregate-role-from='[Offering]'", worksheet) + self.assertNotIn("State/Province", worksheet + window) + + def test_omitted_metadata_field_drops_the_donor_only_attribute(self) -> None: + worksheet, window = self.render(self.primary, self.primary_mappings) + self.assertNotIn("aggregate-role-from", worksheet + window) + self.assertNotIn("State/Province", worksheet + window) + # The column that carried the metadata survives, with its own mapping. + self.assertIn("name='[Offering]'", worksheet) + + def test_every_affected_template_renders_without_the_donor_field(self) -> None: + for resource_id in self.affected: + with self.subTest(resource=resource_id): + worksheet, window = self.render(resource_id) + self.assertNotIn("State/Province", worksheet + window) + self.assertNotIn("aggregate-role-from", worksheet + window) + mapped, _ = self.render(resource_id, **{"State/Province": "Offering"}) + self.assertIn("aggregate-role-from='[Offering]'", mapped) + + +class SyntheticDonorMetadataTest(RenderSupportMixin): + """Metadata-reference discovery, stripping, and its fail-closed backstop.""" + + def with_metadata(self, value: str = "[Region]") -> str: + return SYNTHETIC_BOOKMARK.replace( + " None: + worksheet, _ = self.render_synthetic(self.with_metadata()) + self.assertNotIn("aggregate-role-from", worksheet) + self.assertNotIn("Region", worksheet) + self.assertIn(" None: + worksheet, _ = self.render_synthetic( + self.with_metadata(), + field_mappings={ + "Widget": "Offering", + "Amount": "Revenue", + "Region": "Transaction Date", + }, + ) + self.assertIn("aggregate-role-from='[Transaction Date]'", worksheet) + self.assertNotIn("Region", worksheet) + + def test_unmapped_metadata_field_used_elsewhere_fails_closed(self) -> None: + # The attribute is stripped, but the same unqualified reference also + # appears in a sort, where nothing can safely rewrite it. + broken = self.with_metadata().replace( + "", + "\n ", + ) + with self.assertRaisesRegex( + ResourceError, r"still references the unmapped donor field \[Region\]" + ): + self.render_synthetic(broken) + + def test_metadata_attribute_that_is_not_a_field_reference_is_rejected(self) -> None: + with self.assertRaisesRegex( + ResourceError, "not a single field reference: Region" + ): + self.render_synthetic(self.with_metadata("Region")) + + +class CatalogParameterContractTest(RenderSupportMixin): + """Fix round 1, finding 2: contracts come from the catalog, or not at all.""" + + bookmark = SYNTHETIC_BOOKMARK.replace( + "", + "\n" + " " + "#{{THRESHOLD}}#", + ) + + def test_declared_parameter_without_a_type_fails_closed(self) -> None: + with self.assertRaisesRegex(ResourceError, "has no typed contract"): + self.render_synthetic( + self.bookmark, + catalog_parameters=[{"name": "THRESHOLD"}], + parameters={"THRESHOLD": "5"}, + ) + + def test_name_only_catalog_parameter_fails_closed(self) -> None: + with self.assertRaisesRegex(ResourceError, "without a typed contract"): + self.render_synthetic( + self.bookmark, + catalog_parameters=["THRESHOLD"], + parameters={"THRESHOLD": "5"}, + ) + + def test_enum_contract_without_allowed_values_fails_closed(self) -> None: + with self.assertRaisesRegex(ResourceError, "declares no allowed values"): + self.render_synthetic( + self.bookmark, + catalog_parameters=[{"name": "THRESHOLD", "type": "enum"}], + parameters={"THRESHOLD": "5"}, + ) + + def test_catalog_contract_is_enforced_without_an_overrides_file(self) -> None: + contract = [{"name": "THRESHOLD", "type": "number", "required": True}] + with self.assertRaisesRegex(ResourceError, "must be a number"): + self.render_synthetic( + self.bookmark, + catalog_parameters=contract, + parameters={"THRESHOLD": "not-a-number"}, + ) + worksheet, _ = self.render_synthetic( + self.bookmark, catalog_parameters=contract, parameters={"THRESHOLD": "5"} + ) + self.assertIn("#5#", worksheet) + + +class ExecutableCoverageTest(unittest.TestCase): + """Every executable template must render with an identity mapping.""" + + @staticmethod + def parameter_values(contracts: list[dict[str, object]]) -> dict[str, str]: + """Build one valid value per declared parameter, from the catalog alone.""" + values: dict[str, str] = {} + for contract in contracts: + kind = contract["type"] + if kind == "date": + values[contract["name"]] = "2026-01-01" + elif kind == "enum": + values[contract["name"]] = contract["allowed"][0] + else: + values[contract["name"]] = "1" + return values + + def test_every_executable_template_renders(self) -> None: + catalog = load_catalog(PLUGIN) + executable = [ + entry + for entry in catalog["resources"] + if entry["tier"] == "executable" and entry["type"] == "template" + ] + self.assertEqual(len(executable), 24) + for entry in executable: + resource_id = entry["id"] + with self.subTest(resource=resource_id): + mappings = { + field["sourceField"]: field["sourceField"] + for field in entry["fields"] + } + worksheet, window = render_bookmark( + plugin_root=PLUGIN, + resource_id=resource_id, + worksheet_name=f"Sheet {resource_id}", + datasource_name="Sales Data", + field_mappings=mappings, + parameters=self.parameter_values(entry["parameters"]), + ) + combined = worksheet + window + for donor in entry["datasources"]: + self.assertNotIn(donor, combined) + self.assertNotIn("{{", combined) + self.assertNotIn(" None: + datasource = ET.parse(FIXTURES / "target-datasource.xml").getroot() + self.assertEqual(datasource.tag, "datasource") + self.assertEqual(datasource.get("name"), "Sales Data") + available = { + column.get("name").strip("[]") for column in datasource.iter("column") + } + for case in self.cases.values(): + for target in case["field_mappings"].values(): + self.assertIn(target, available) + + def test_golden_fragments_match(self) -> None: + for resource_id, case in self.cases.items(): + with self.subTest(resource=resource_id): + worksheet, window = render_bookmark( + plugin_root=PLUGIN, + resource_id=resource_id, + worksheet_name=case["worksheet_name"], + datasource_name="Sales Data", + field_mappings=case["field_mappings"], + parameters=case["parameters"], + ) + expected_worksheet = ( + GOLDEN / f"{resource_id}.worksheet.xml" + ).read_text(encoding="utf-8") + expected_window = (GOLDEN / f"{resource_id}.window.xml").read_text( + encoding="utf-8" + ) + self.assertEqual(worksheet + "\n", expected_worksheet) + self.assertEqual(window + "\n", expected_window) + + +class UnsafeOutputCheckTest(unittest.TestCase): + """Pins the donor checks a caption exemption is not allowed to weaken. + + Two of them — a donor-addressing ``name``/``datasource`` attribute and a + donor qualified reference — cannot be produced through the public render + path, which rewrites both before the check runs, so they are exercised + against the check itself. + """ + + def reject(self, fragment: str, *, target_caption: str | None = None) -> None: + _reject_unsafe_output( + {"worksheet": fragment}, + donor="Donor DS", + target_datasource="Sales Data", + raw_to_logical={}, + field_mappings={}, + target_caption=target_caption, + ) + + def test_a_caption_holding_the_target_label_is_allowed(self) -> None: + self.reject( + "", + target_caption="Donor DS", + ) + + def test_a_donor_addressing_name_attribute_is_rejected(self) -> None: + with self.assertRaisesRegex(ResourceError, "still references the donor"): + self.reject( + "", + target_caption="Donor DS", + ) + + def test_a_donor_addressing_datasource_attribute_is_rejected(self) -> None: + with self.assertRaisesRegex(ResourceError, "still references the donor"): + self.reject( + "", + target_caption="Donor DS", + ) + + def test_a_donor_qualified_reference_is_rejected(self) -> None: + with self.assertRaisesRegex(ResourceError, "still references the donor"): + self.reject( + "" + "[Donor DS].[none:Widget:nk]", + target_caption="Donor DS", + ) + + def test_an_unexempted_caption_is_rejected(self) -> None: + """With no target caption supplied, nothing is exempt.""" + with self.assertRaisesRegex(ResourceError, "still references the donor"): + self.reject("") + + def test_an_unresolved_template_token_is_still_rejected(self) -> None: + with self.assertRaisesRegex(ResourceError, "unresolved template token"): + self.reject( + "", + target_caption="Donor DS", + ) + + def test_a_foreign_federated_datasource_is_still_rejected(self) -> None: + with self.assertRaisesRegex(ResourceError, "federated datasource"): + self.reject( + "", + target_caption="Donor DS", + ) + + def test_a_stale_donor_field_is_still_rejected(self) -> None: + with self.assertRaisesRegex(ResourceError, "unmapped donor field"): + _reject_unsafe_output( + {"worksheet": "[Widget]"}, + donor="Donor DS", + target_datasource="Sales Data", + raw_to_logical={"Widget": "Widget"}, + field_mappings={}, + target_caption="Donor DS", + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/plugins/tableau/tests/test_tableau_resources_target_metadata.py b/plugins/tableau/tests/test_tableau_resources_target_metadata.py new file mode 100644 index 0000000..75c521f --- /dev/null +++ b/plugins/tableau/tests/test_tableau_resources_target_metadata.py @@ -0,0 +1,366 @@ +"""Target-datasource metadata tests. + +Covers the three defects that a real Tableau workbook exposes but the bundled +fixtures did not: + +1. Fields declared only under ``/`` were + invisible to mapping validation, so every mapping against such a workbook + was rejected. +2. A rendered ```` column kept the donor's + ``datatype``/``user-datatype``/``role`` after its name was rewritten to a + target field, so the declaration described a field that no longer existed. +3. The rendered per-view ```` caption was set to the target's + internal ``federated.`` name instead of its human caption. +""" + +from pathlib import Path +import shutil +import sys +import tempfile +import unittest +import xml.etree.ElementTree as ET + +PLUGIN = Path(__file__).resolve().parents[1] +FIXTURES = PLUGIN / "tests/fixtures" +sys.path.insert(0, str(PLUGIN / "scripts")) + +from tableau_resources import ( # noqa: E402 + ResourceError, + inject_resource, + inspect_datasources, + instantiate_resource, +) + +FIXTURE_DATASOURCE = "federated.0fixture1sales2data" +METADATA_DATASOURCE = "federated.0meta1records2only" +TARGET_DATASOURCE = "federated.0captioned" +DONOR_DATASOURCE = "Sample - Superstore" +LINE_MAPPINGS = {"ARR": "Revenue", "Close Date": "Transaction Date"} +BAR_MAPPINGS = { + "ARR": "Revenue", + "Close Date": "Transaction Date", + "Product": "Offering", +} +BAR_PARAMETERS = { + "DATE_MIN": "2026-01-01", + "DATE_MAX": "2026-06-30", + "DIRECTION": "DESC", +} + + +def dependency_columns(workbook: str, worksheet_name: str) -> dict[str, ET.Element]: + """Return the worksheet's dependency ```` declarations by name.""" + root = ET.fromstring(workbook) + for worksheet in root.findall("worksheets/worksheet"): + if worksheet.get("name") != worksheet_name: + continue + return { + (column.get("name") or "")[1:-1]: column + for column in worksheet.iter("column") + if (column.get("name") or "").startswith("[") + } + raise AssertionError(f"no worksheet named {worksheet_name}") + + +def view_datasource(workbook: str, worksheet_name: str) -> ET.Element: + """Return the worksheet's per-view ```` declaration.""" + root = ET.fromstring(workbook) + for worksheet in root.findall("worksheets/worksheet"): + if worksheet.get("name") == worksheet_name: + return worksheet.find("table/view/datasources/datasource") + raise AssertionError(f"no worksheet named {worksheet_name}") + + +class TargetMetadataTest(unittest.TestCase): + maxDiff = None + + def setUp(self) -> None: + self.tmp = Path(tempfile.mkdtemp()) + self.addCleanup(shutil.rmtree, self.tmp, ignore_errors=True) + + def inject_line_chart(self, **overrides: object) -> str: + arguments: dict[str, object] = { + "input_path": FIXTURES / "existing-workbook.twb", + "output_path": self.tmp / "output.twb", + "resource_id": "insights__line_chart", + "worksheet_name": "ARR Trend", + "datasource_name": FIXTURE_DATASOURCE, + "field_mappings": dict(LINE_MAPPINGS), + "parameters": {}, + } + arguments.update(overrides) + return inject_resource(**arguments) + + def write_workbook(self, name: str, datasource: str) -> Path: + """Write a minimal workbook around one datasource definition.""" + path = self.tmp / f"{name}.twb" + path.write_text( + "\n" + "\n" + " \n" + f"{datasource}\n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n" + ) + return path + + # --- finding 1: metadata-record fields ---------------------------------- + + def test_inspect_datasources_unions_metadata_record_fields(self) -> None: + text = (FIXTURES / "metadata-records-workbook.twb").read_text() + self.assertEqual( + inspect_datasources(text), + {METADATA_DATASOURCE: {"Revenue", "Transaction Date", "Offering"}}, + ) + + def test_inject_into_a_metadata_record_only_workbook(self) -> None: + output = self.inject_line_chart( + input_path=FIXTURES / "metadata-records-workbook.twb", + datasource_name=METADATA_DATASOURCE, + ) + self.assertIn(f"[{METADATA_DATASOURCE}].[sum:Revenue:qk]", output) + self.assertEqual( + [ + item.get("name") + for item in ET.fromstring(output).findall("worksheets/worksheet") + ], + ["ARR Trend"], + ) + + def test_inspect_datasources_unions_columns_and_metadata_records(self) -> None: + path = self.write_workbook( + "mixed", + " \n" + " \n" + " \n" + " \n" + " [Only In Records]\n" + " string\n" + " \n" + " \n" + " \n" + " \n" + " ", + ) + self.assertEqual( + inspect_datasources(path.read_text()), + {"Mixed": {"Only In Records", "Only A Column"}}, + ) + + def test_inspect_datasources_ignores_malformed_metadata_records(self) -> None: + path = self.write_workbook( + "malformed", + " \n" + " \n" + " \n" + " \n" + " [Not A Column]\n" + " \n" + " \n" + " unbracketed\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " [Good]\n" + " string\n" + " \n" + " \n" + " \n" + " ", + ) + self.assertEqual(inspect_datasources(path.read_text()), {"Odd": {"Good"}}) + + # --- finding 2: dependency metadata rewrite ----------------------------- + + def test_mapped_dependency_column_uses_target_datatype(self) -> None: + """The donor's ARR is an integer; the target's Revenue is a real.""" + output = self.inject_line_chart() + revenue = dependency_columns(output, "ARR Trend")["Revenue"] + self.assertEqual(revenue.get("datatype"), "real") + self.assertEqual(revenue.get("user-datatype"), "real") + self.assertEqual(revenue.get("role"), "measure") + + def test_mapped_dependency_column_uses_metadata_record_datatype(self) -> None: + output = self.inject_line_chart( + input_path=FIXTURES / "metadata-records-workbook.twb", + datasource_name=METADATA_DATASOURCE, + ) + columns = dependency_columns(output, "ARR Trend") + self.assertEqual(columns["Revenue"].get("datatype"), "real") + self.assertEqual(columns["Revenue"].get("role"), "measure") + self.assertEqual(columns["Transaction Date"].get("datatype"), "date") + self.assertEqual(columns["Transaction Date"].get("role"), "dimension") + + def test_unmapped_dependency_columns_keep_donor_metadata(self) -> None: + """Only explicitly mapped fields are rewritten.""" + output = instantiate_resource( + datasource_definition_path=FIXTURES / "target-datasource.xml", + output_path=self.tmp / "bar.twb", + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings=dict(BAR_MAPPINGS), + parameters=dict(BAR_PARAMETERS), + ) + columns = dependency_columns(output, "ARR by Offering") + self.assertEqual(columns["Offering"].get("datatype"), "string") + self.assertEqual(columns["Offering"].get("aggregation"), "Count") + self.assertEqual(columns["Offering"].get("visual-totals"), "Default") + + def test_inject_rejects_a_cross_family_mapping(self) -> None: + with self.assertRaisesRegex(ResourceError, "ARR"): + self.inject_line_chart( + field_mappings={ + "ARR": "Offering", + "Close Date": "Transaction Date", + } + ) + self.assertFalse((self.tmp / "output.twb").exists()) + + def test_inject_rejects_a_temporal_to_string_mapping(self) -> None: + with self.assertRaisesRegex(ResourceError, "Close Date"): + self.inject_line_chart( + field_mappings={"ARR": "Revenue", "Close Date": "Offering"} + ) + self.assertFalse((self.tmp / "output.twb").exists()) + + def test_inject_allows_an_integer_to_real_mapping(self) -> None: + """Both are numeric, so the mapping is legal and the type is rewritten.""" + output = self.inject_line_chart() + self.assertEqual( + dependency_columns(output, "ARR Trend")["Revenue"].get("datatype"), "real" + ) + + def test_inject_rejects_a_target_field_of_unknown_type(self) -> None: + path = self.write_workbook( + "untyped", + " \n" + " \n" + " \n" + " ", + ) + with self.assertRaisesRegex(ResourceError, "Revenue"): + self.inject_line_chart(input_path=path, datasource_name="Untyped") + self.assertFalse((self.tmp / "output.twb").exists()) + + # --- finding 3: per-view caption ---------------------------------------- + + def test_view_datasource_uses_the_target_caption(self) -> None: + output = self.inject_line_chart() + declared = view_datasource(output, "ARR Trend") + self.assertEqual(declared.get("caption"), "Sales Data") + self.assertEqual(declared.get("name"), FIXTURE_DATASOURCE) + + def test_view_datasource_falls_back_to_the_internal_name(self) -> None: + path = self.write_workbook( + "uncaptioned", + " \n" + " \n" + " \n" + " ", + ) + output = self.inject_line_chart( + input_path=path, datasource_name="Uncaptioned" + ) + declared = view_datasource(output, "ARR Trend") + self.assertEqual(declared.get("caption"), "Uncaptioned") + self.assertEqual(declared.get("name"), "Uncaptioned") + + def test_view_datasource_caption_is_re_escaped(self) -> None: + """A caption is decoded when read, so it must be escaped when written.""" + path = self.write_workbook( + "escaped", + " \n" + " \n" + " \n" + " ", + ) + output = self.inject_line_chart( + input_path=path, datasource_name="federated.0escaped" + ) + self.assertIn("caption='Sales & Ops <EMEA>'", output) + self.assertEqual( + view_datasource(output, "ARR Trend").get("caption"), + "Sales & Ops ", + ) + + # --- a legitimate caption may look like donor residue --------------------- + + def write_typed_datasource(self, caption: str) -> str: + """Return a datasource declaration the line chart can be mapped onto.""" + return ( + f" \n" + " \n" + " \n" + " " + ) + + def assert_injects_with_caption(self, caption: str) -> None: + path = self.write_workbook( + f"captioned-{abs(hash(caption))}", self.write_typed_datasource(caption) + ) + output = self.inject_line_chart( + input_path=path, datasource_name=TARGET_DATASOURCE + ) + declared = view_datasource(output, "ARR Trend") + self.assertEqual(declared.get("caption"), caption) + self.assertEqual(declared.get("name"), TARGET_DATASOURCE) + self.assertIn(f"[{TARGET_DATASOURCE}].[sum:Revenue:qk]", output) + + def test_inject_allows_a_caption_equal_to_the_donor(self) -> None: + """The target may legitimately be captioned after the donor itself.""" + self.assert_injects_with_caption(DONOR_DATASOURCE) + + def test_inject_allows_a_caption_containing_the_donor(self) -> None: + self.assert_injects_with_caption(f"{DONOR_DATASOURCE} (EMEA Rollup)") + + def test_instantiate_allows_a_caption_equal_to_the_donor(self) -> None: + definition = self.tmp / "donor-caption.xml" + definition.write_text( + f"\n" + " \n" + " \n" + "\n" + ) + output = instantiate_resource( + datasource_definition_path=definition, + output_path=self.tmp / "donor-caption.twb", + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + field_mappings=dict(LINE_MAPPINGS), + parameters={}, + ) + declared = view_datasource(output, "ARR Trend") + self.assertEqual(declared.get("caption"), DONOR_DATASOURCE) + self.assertEqual(declared.get("name"), "Sales Data") + self.assertIn("[Sales Data].[sum:Revenue:qk]", output) + + def test_datasource_references_keep_the_internal_name(self) -> None: + output = self.inject_line_chart() + self.assertIn(f"[{FIXTURE_DATASOURCE}].[sum:Revenue:qk]", output) + self.assertIn(f"datasource='{FIXTURE_DATASOURCE}'", output) + self.assertNotIn("[Sales Data].[", output) + + +if __name__ == "__main__": + unittest.main() diff --git a/plugins/tableau/tests/test_tableau_resources_validation.py b/plugins/tableau/tests/test_tableau_resources_validation.py new file mode 100644 index 0000000..1d78058 --- /dev/null +++ b/plugins/tableau/tests/test_tableau_resources_validation.py @@ -0,0 +1,730 @@ +"""Fail-closed workbook validation tests. + +Covers the ordered structural rules of :func:`validate_workbook_text`, the +path-based :func:`validate_workbook`, the ``validate`` CLI command, and the +guarantee that a workbook failing validation is never written to disk. + +The workbooks built here are deliberately minimal rather than realistic: each +one isolates a single rule so an ordering or dedup regression cannot hide +behind an unrelated error. +""" + +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile +import unittest +from unittest import mock +import xml.etree.ElementTree as ET + +PLUGIN = Path(__file__).resolve().parents[1] +FIXTURES = PLUGIN / "tests/fixtures" +CLI = PLUGIN / "scripts/tableau_resources.py" +STARTER = PLUGIN / "resources/starters/minimal-workbook.twb" +sys.path.insert(0, str(PLUGIN / "scripts")) + +import tableau_resources # noqa: E402 +from tableau_resources import ( # noqa: E402 + ResourceError, + inject_resource, + instantiate_resource, + validate_workbook, + validate_workbook_text, +) + +FIXTURE_DATASOURCE = "federated.0fixture1sales2data" +LINE_MAPPINGS = {"ARR": "Revenue", "Close Date": "Transaction Date"} +BAR_MAPPINGS = { + "ARR": "Revenue", + "Close Date": "Transaction Date", + "Product": "Offering", +} +BAR_PARAMETERS = { + "DATE_MIN": "2026-01-01", + "DATE_MAX": "2026-06-30", + "DIRECTION": "DESC", +} +BROKEN_WORKBOOK = ( + "{{field_base_1}}" + "" +) +HIDDEN_SHEET_ERROR = "worksheet-window-name-mismatch: Hidden Sheet" + + +def workbook(datasources: str = "", worksheets: str = "", windows: str = "") -> str: + """Build a minimal workbook with the three required containers.""" + return ( + "" + f"{datasources}" + f"{worksheets}" + f"{windows}" + "" + ) + + +def sheet(name: str, body: str) -> str: + return f"
{body}
" + + +def window(name: str) -> str: + return f"" + + +class ValidationTest(unittest.TestCase): + def setUp(self) -> None: + self.tmp = Path(tempfile.mkdtemp()) + self.addCleanup(shutil.rmtree, self.tmp, ignore_errors=True) + + def run_cli(self, *args: str) -> subprocess.CompletedProcess[str]: + return subprocess.run( + [sys.executable, str(CLI), *args], + text=True, + capture_output=True, + check=False, + ) + + # --- documents that must validate --------------------------------------- + + def test_validate_accepts_the_fixture_workbook(self) -> None: + self.assertEqual(validate_workbook(FIXTURES / "existing-workbook.twb"), []) + + def test_validate_accepts_an_injected_workbook(self) -> None: + output = inject_resource( + input_path=FIXTURES / "existing-workbook.twb", + output_path=self.tmp / "output.twb", + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name=FIXTURE_DATASOURCE, + field_mappings=dict(LINE_MAPPINGS), + parameters={}, + ) + self.assertEqual(validate_workbook_text(output), []) + self.assertEqual(validate_workbook(self.tmp / "output.twb"), []) + + def test_validate_accepts_an_instantiated_workbook(self) -> None: + output = instantiate_resource( + datasource_definition_path=FIXTURES / "target-datasource.xml", + output_path=self.tmp / "starter-output.twb", + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings=dict(BAR_MAPPINGS), + parameters=dict(BAR_PARAMETERS), + ) + self.assertEqual(validate_workbook_text(output), []) + + # --- document shape ----------------------------------------------------- + + def test_validate_rejects_malformed_xml(self) -> None: + self.assertEqual( + validate_workbook_text(""), + ["malformed-xml"], + ) + + def test_validate_rejects_a_non_workbook_root(self) -> None: + self.assertEqual( + validate_workbook_text((FIXTURES / "target-datasource.xml").read_text()), + ["not-tableau-workbook"], + ) + + def test_validate_reports_every_missing_container(self) -> None: + self.assertEqual( + validate_workbook_text(""), + [ + "missing-datasources-container", + "missing-worksheets-container", + "missing-windows-container", + ], + ) + + def test_validate_rejects_unresolved_tokens(self) -> None: + path = self.tmp / "tokens.twb" + path.write_text(BROKEN_WORKBOOK) + self.assertIn("unresolved-template-token", validate_workbook(path)) + + def test_validate_rejects_an_unresolved_federated_placeholder(self) -> None: + text = workbook( + worksheets=sheet("A", "[federated.XXXX].[none:Offering:nk]"), + windows=window("A"), + ) + self.assertIn("unresolved-federated-placeholder", validate_workbook_text(text)) + + def test_validate_accepts_a_declared_federated_datasource_name(self) -> None: + text = workbook( + datasources=( + f"" + "" + "" + ), + worksheets=sheet( + "A", f"[{FIXTURE_DATASOURCE}].[sum:Revenue:qk]" + ), + windows=window("A"), + ) + self.assertEqual(validate_workbook_text(text), []) + + # --- worksheet and window names ----------------------------------------- + + def test_validate_rejects_a_duplicate_worksheet_name(self) -> None: + text = workbook( + worksheets=sheet("A", "") + sheet("A", ""), + windows=window("A"), + ) + self.assertIn("duplicate-worksheet-name: A", validate_workbook_text(text)) + + def test_validate_rejects_a_duplicate_window_name(self) -> None: + text = workbook( + worksheets=sheet("A", ""), + windows=window("A") + window("A"), + ) + self.assertIn("duplicate-window-name: A", validate_workbook_text(text)) + + def test_validate_rejects_a_worksheet_without_a_window(self) -> None: + text = workbook(worksheets=sheet("A", ""), windows="") + self.assertIn("worksheet-window-name-mismatch: A", validate_workbook_text(text)) + + def test_validate_rejects_a_worksheet_window_without_a_worksheet(self) -> None: + text = workbook(worksheets="", windows=window("A")) + self.assertIn("worksheet-window-name-mismatch: A", validate_workbook_text(text)) + + def test_validate_ignores_non_worksheet_windows(self) -> None: + text = workbook( + worksheets=sheet("A", ""), + windows=window("A") + "", + ) + self.assertEqual(validate_workbook_text(text), []) + + # --- datasource and field references ------------------------------------ + + def test_validate_rejects_missing_datasource_reference(self) -> None: + path = self.tmp / "missing-ds.twb" + path.write_text( + "" + "[Missing].[none:Category:nk]
" + "
" + "
" + ) + self.assertIn("unknown-datasource-reference: Missing", validate_workbook(path)) + + def test_validate_rejects_an_unknown_field_reference(self) -> None: + text = workbook( + datasources=( + "" + "" + "" + ), + worksheets=sheet("A", "[Sales].[sum:Nope:qk]"), + windows=window("A"), + ) + self.assertEqual( + validate_workbook_text(text), ["unknown-field-reference: Sales.Nope"] + ) + + def test_validate_resolves_worksheet_local_field_definitions(self) -> None: + text = workbook( + datasources="", + worksheets=sheet( + "A", + "" + "" + "" + "" + "[Sales].[none:Offering:nk]", + ), + windows=window("A"), + ) + self.assertEqual(validate_workbook_text(text), []) + + def test_validate_ignores_pseudo_and_generated_fields(self) -> None: + text = workbook( + datasources="", + worksheets=sheet( + "A", + "[Sales].[:Measure Names]" + "[Sales].[Latitude (generated)]" + "[Sales].[Longitude (generated)]", + ), + windows=window("A"), + ) + self.assertEqual(validate_workbook_text(text), []) + + def test_validate_ignores_references_inside_datasource_definitions(self) -> None: + text = workbook( + datasources=( + "" + "" + "" + "" + "" + "" + "" + ), + worksheets=sheet("A", "[Sales].[sum:Revenue:qk]"), + windows=window("A"), + ) + self.assertEqual(validate_workbook_text(text), []) + + def test_validate_ignores_geographic_semantic_roles(self) -> None: + """A semantic role shares the reference shape but names no datasource. + + ``distribution-bar-code-chart`` carries exactly this metadata, so a + scan that treated it as a reference would reject a workbook the CLI + itself had just generated. + """ + text = workbook( + datasources="", + worksheets=sheet( + "A", + "" + "" + "" + "[Sales].[State/Province]", + ), + windows=window("A"), + ) + self.assertEqual(validate_workbook_text(text), []) + + def test_validate_ignores_semantic_values(self) -> None: + """A semantic-value key is a geocoding role, not a field reference. + + Tableau types both as QualifiedName-ST, so a map sheet's geocoding + default is written exactly like a datasource-qualified reference. + """ + text = workbook( + datasources="", + worksheets=sheet( + "A", + "" + "" + "", + ), + windows=window("A"), + ) + self.assertEqual(validate_workbook_text(text), []) + + def test_validate_ignores_a_semantic_role_outside_a_definition(self) -> None: + text = workbook( + datasources="", + worksheets=sheet( + "A", "" + ), + windows=window("A"), + ) + self.assertEqual(validate_workbook_text(text), []) + + def test_validate_accepts_a_map_workbook(self) -> None: + self.assertEqual(validate_workbook(FIXTURES / "map-workbook.twb"), []) + + def test_inject_into_a_workbook_with_a_map_sheet(self) -> None: + """Geographic metadata must not block extending a real map workbook.""" + output = inject_resource( + input_path=FIXTURES / "map-workbook.twb", + output_path=self.tmp / "map-output.twb", + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name=FIXTURE_DATASOURCE, + field_mappings=dict(LINE_MAPPINGS), + parameters={}, + ) + self.assertIn(" None: + text = workbook( + datasources="", + worksheets=sheet( + "A", + "" + "" + "" + "", + ), + windows=window("A"), + ) + self.assertEqual( + validate_workbook_text(text), ["unknown-datasource-reference: Missing"] + ) + + # --- ordering and dedup ------------------------------------------------- + + def test_validate_returns_stable_ordered_deduplicated_errors(self) -> None: + text = ( + "" + "" + "[Missing].[none:Category:nk]{{DATE_MIN}}" + "
" + "" + "[federated.XXXX].[none:Category:nk]" + "
" + "
" + "" + "
" + ) + self.assertEqual( + validate_workbook_text(text), + [ + "missing-datasources-container", + "unresolved-template-token", + "unresolved-federated-placeholder", + "duplicate-worksheet-name: A", + "duplicate-window-name: B", + "worksheet-window-name-mismatch: A", + "worksheet-window-name-mismatch: B", + "unknown-datasource-reference: Missing", + "unknown-datasource-reference: federated.XXXX", + ], + ) + + def test_validate_rejects_an_unreadable_workbook(self) -> None: + with self.assertRaisesRegex(ResourceError, "Cannot read workbook"): + validate_workbook(self.tmp / "absent.twb") + + # --- no partial output -------------------------------------------------- + + def test_failed_injection_creates_no_partial_output(self) -> None: + output = self.tmp / "partial.twb" + with self.assertRaises(ResourceError): + inject_resource( + input_path=FIXTURES / "existing-workbook.twb", + output_path=output, + resource_id="insights__bar_chart", + worksheet_name="Broken", + datasource_name="Sales Data", + field_mappings={}, + parameters={}, + ) + self.assertFalse(output.exists()) + + def test_inject_rejects_an_invalid_generated_workbook(self) -> None: + output = self.tmp / "invalid.twb" + with mock.patch.object( + tableau_resources, "inject_fragments", return_value=BROKEN_WORKBOOK + ): + with self.assertRaisesRegex( + ResourceError, + "Generated workbook failed validation: unresolved-template-token", + ): + inject_resource( + input_path=FIXTURES / "existing-workbook.twb", + output_path=output, + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name=FIXTURE_DATASOURCE, + field_mappings=dict(LINE_MAPPINGS), + parameters={}, + ) + self.assertFalse(output.exists()) + + def test_instantiate_rejects_an_invalid_generated_workbook(self) -> None: + output = self.tmp / "invalid-starter.twb" + with mock.patch.object( + tableau_resources, "inject_fragments", return_value=BROKEN_WORKBOOK + ): + with self.assertRaisesRegex( + ResourceError, "Generated workbook failed validation" + ): + instantiate_resource( + datasource_definition_path=FIXTURES / "target-datasource.xml", + output_path=output, + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings=dict(BAR_MAPPINGS), + parameters=dict(BAR_PARAMETERS), + ) + self.assertFalse(output.exists()) + + def test_invalid_generation_leaves_an_existing_output_untouched(self) -> None: + output = self.tmp / "keep.twb" + output.write_text("do not replace") + with mock.patch.object( + tableau_resources, "inject_fragments", return_value=BROKEN_WORKBOOK + ): + with self.assertRaisesRegex( + ResourceError, "Generated workbook failed validation" + ): + inject_resource( + input_path=FIXTURES / "existing-workbook.twb", + output_path=output, + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name=FIXTURE_DATASOURCE, + field_mappings=dict(LINE_MAPPINGS), + parameters={}, + overwrite=True, + ) + self.assertEqual(output.read_text(), "do not replace") + + # --- delta gate --------------------------------------------------------- + + def hidden_sheet_workbook(self) -> Path: + """An input workbook that already fails one rule, as a real one may. + + Tableau writes no worksheet window for a sheet that exists only to + feed a dashboard, so this is the shape of a genuine pre-existing + mismatch rather than a contrived one. + """ + source = self.tmp / "hidden-sheet.twb" + source.write_text( + (FIXTURES / "existing-workbook.twb") + .read_text() + .replace( + "
", + " \n" + " \n" + " \n" + " ", + ) + ) + return source + + def test_input_baseline_errors_are_reported_before_injection(self) -> None: + self.assertEqual( + validate_workbook(self.hidden_sheet_workbook()), [HIDDEN_SHEET_ERROR] + ) + + def test_inject_allows_an_unchanged_pre_existing_error(self) -> None: + output_path = self.tmp / "hidden-sheet-output.twb" + output = inject_resource( + input_path=self.hidden_sheet_workbook(), + output_path=output_path, + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name=FIXTURE_DATASOURCE, + field_mappings=dict(LINE_MAPPINGS), + parameters={}, + ) + self.assertTrue(output_path.exists()) + self.assertEqual(validate_workbook_text(output), [HIDDEN_SHEET_ERROR]) + self.assertEqual( + [ + item.get("name") + for item in ET.fromstring(output).findall("worksheets/worksheet") + ], + ["Existing Sheet", "Hidden Sheet", "ARR Trend"], + ) + + def test_inject_blocks_a_newly_introduced_error(self) -> None: + output_path = self.tmp / "introduced.twb" + with mock.patch.object( + tableau_resources, "inject_fragments", return_value=BROKEN_WORKBOOK + ): + with self.assertRaises(ResourceError) as raised: + inject_resource( + input_path=self.hidden_sheet_workbook(), + output_path=output_path, + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name=FIXTURE_DATASOURCE, + field_mappings=dict(LINE_MAPPINGS), + parameters={}, + ) + message = str(raised.exception) + self.assertEqual( + message, + "Generated workbook failed validation: unresolved-template-token " + "(pre-existing errors carried in from the input workbook: " + f"{HIDDEN_SHEET_ERROR})", + ) + self.assertFalse(output_path.exists()) + + def test_inject_blocks_a_new_instance_of_an_inherited_rule(self) -> None: + """Inheritance is per error, not per rule. + + The input already has an unpaired sheet, but that cannot license a + different unpaired sheet in the output. + """ + output_path = self.tmp / "second-mismatch.twb" + introduced = ( + "" + "" + "" + ) + with mock.patch.object( + tableau_resources, "inject_fragments", return_value=introduced + ): + with self.assertRaises(ResourceError) as raised: + inject_resource( + input_path=self.hidden_sheet_workbook(), + output_path=output_path, + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name=FIXTURE_DATASOURCE, + field_mappings=dict(LINE_MAPPINGS), + parameters={}, + ) + message = str(raised.exception) + self.assertIn("worksheet-window-name-mismatch: Another Sheet", message) + self.assertNotIn( + "Generated workbook failed validation: " + "worksheet-window-name-mismatch: Hidden Sheet", + message, + ) + self.assertFalse(output_path.exists()) + + def test_inject_allows_an_output_that_removes_an_input_error(self) -> None: + output_path = self.tmp / "repaired.twb" + repaired = (FIXTURES / "existing-workbook.twb").read_text() + with mock.patch.object( + tableau_resources, "inject_fragments", return_value=repaired + ): + output = inject_resource( + input_path=self.hidden_sheet_workbook(), + output_path=output_path, + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name=FIXTURE_DATASOURCE, + field_mappings=dict(LINE_MAPPINGS), + parameters={}, + ) + self.assertEqual(validate_workbook_text(output), []) + self.assertEqual(output_path.read_text(), repaired) + + # --- instantiate baseline ----------------------------------------------- + + def write_definition(self, name: str, body: str) -> Path: + """Write a datasource definition that satisfies the bar mappings.""" + path = self.tmp / f"{name}.xml" + path.write_text( + f"{body}\n" + " \n" + " \n" + " \n" + "\n" + ) + return path + + def instantiate_bar(self, definition: Path, output: Path) -> str: + return instantiate_resource( + datasource_definition_path=definition, + output_path=output, + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings=dict(BAR_MAPPINGS), + parameters=dict(BAR_PARAMETERS), + ) + + def test_starter_workbook_is_a_clean_baseline(self) -> None: + """The instantiate baseline inherits nothing, so nothing is excused.""" + self.assertEqual(validate_workbook(STARTER), []) + + def test_instantiate_rejects_a_definition_with_a_template_token(self) -> None: + definition = self.write_definition( + "token-definition", + "\n" + " \n" + " \n" + " ", + ) + output = self.tmp / "token-output.twb" + with self.assertRaisesRegex( + ResourceError, + "^Generated workbook failed validation: unresolved-template-token$", + ): + self.instantiate_bar(definition, output) + self.assertFalse(output.exists()) + + def test_instantiate_rejects_a_definition_whose_caption_is_a_token(self) -> None: + """The caption reaches the rendered view, so it is checked as input.""" + definition = self.write_definition( + "caption-token-definition", + "", + ) + output = self.tmp / "caption-token-output.twb" + with self.assertRaisesRegex( + ResourceError, + "^datasource_caption must not contain a template token: " + r"\{\{DATASOURCE\}\}$", + ): + self.instantiate_bar(definition, output) + self.assertFalse(output.exists()) + + def test_instantiate_rejects_a_definition_with_a_federated_placeholder( + self, + ) -> None: + definition = self.write_definition( + "federated-definition", + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " ", + ) + output = self.tmp / "federated-output.twb" + with self.assertRaisesRegex( + ResourceError, + "^Generated workbook failed validation: " + "unresolved-federated-placeholder$", + ): + self.instantiate_bar(definition, output) + self.assertFalse(output.exists()) + + def test_instantiate_accepts_a_clean_definition(self) -> None: + output_path = self.tmp / "clean-output.twb" + output = self.instantiate_bar( + self.write_definition( + "clean-definition", + "", + ), + output_path, + ) + self.assertEqual(validate_workbook_text(output), []) + self.assertTrue(output_path.exists()) + + def test_instantiate_accepts_a_federated_definition_name(self) -> None: + """A real federated name is not a placeholder and must still work.""" + output_path = self.tmp / "clean-federated-output.twb" + output = self.instantiate_bar( + self.write_definition( + "clean-federated-definition", + f"", + ), + output_path, + ) + self.assertEqual(validate_workbook_text(output), []) + self.assertIn(f"[{FIXTURE_DATASOURCE}].[sum:Revenue:qk]", output) + self.assertTrue(output_path.exists()) + + # --- CLI ---------------------------------------------------------------- + + def test_cli_validate_exits_zero_for_a_valid_workbook(self) -> None: + result = self.run_cli( + "validate", "--input", str(FIXTURES / "existing-workbook.twb") + ) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(result.stdout.strip(), "[]") + + def test_cli_validate_exits_one_with_json_errors(self) -> None: + path = self.tmp / "tokens.twb" + path.write_text(BROKEN_WORKBOOK) + result = self.run_cli("validate", "--input", str(path)) + self.assertEqual(result.returncode, 1) + self.assertIn("unresolved-template-token", result.stdout) + self.assertNotIn("Traceback", result.stderr) + + def test_cli_validate_reports_an_unreadable_input(self) -> None: + result = self.run_cli("validate", "--input", str(self.tmp / "absent.twb")) + self.assertEqual(result.returncode, 2) + self.assertIn("Cannot read workbook", result.stderr) + self.assertNotIn("Traceback", result.stderr) + + +if __name__ == "__main__": + unittest.main() diff --git a/plugins/tableau/tests/test_tableau_resources_workbook.py b/plugins/tableau/tests/test_tableau_resources_workbook.py new file mode 100644 index 0000000..ea872e7 --- /dev/null +++ b/plugins/tableau/tests/test_tableau_resources_workbook.py @@ -0,0 +1,525 @@ +"""Workbook instantiation and injection tests. + +Covers datasource inspection, target-field validation, bounded fragment +insertion, duplicate-name rejection, atomic output, and the ``instantiate`` +and ``inject`` CLI commands. + +``existing-workbook.twb`` mirrors a real Tableau workbook: its datasource +carries the human caption ``Sales Data`` and the internal name +``federated.0fixture1sales2data``. The CLI addresses datasources by internal +name, so every call here passes the federated name rather than the caption. +""" + +import difflib +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile +import unittest +import xml.etree.ElementTree as ET + +PLUGIN = Path(__file__).resolve().parents[1] +FIXTURES = PLUGIN / "tests/fixtures" +CLI = PLUGIN / "scripts/tableau_resources.py" +STARTER = PLUGIN / "resources/starters/minimal-workbook.twb" +sys.path.insert(0, str(PLUGIN / "scripts")) + +from tableau_resources import ( # noqa: E402 + ResourceError, + atomic_write, + inject_fragments, + inject_resource, + inspect_datasources, + instantiate_resource, +) + +FIXTURE_DATASOURCE = "federated.0fixture1sales2data" +LINE_MAPPINGS = {"ARR": "Revenue", "Close Date": "Transaction Date"} +BAR_MAPPINGS = { + "ARR": "Revenue", + "Close Date": "Transaction Date", + "Product": "Offering", +} +BAR_PARAMETERS = { + "DATE_MIN": "2026-01-01", + "DATE_MAX": "2026-06-30", + "DIRECTION": "DESC", +} +PAIRED_MAPPINGS = { + "Customer Name": "Offering", + "Order Date": "Transaction Date", + "Profit": "Revenue", +} +REFERENCE_ONLY_ID = ( + "magnitude__horizontal-bar__compare-discrete-categories-from-zero" +) + + +class WorkbookTransformTest(unittest.TestCase): + def setUp(self) -> None: + self.tmp = Path(tempfile.mkdtemp()) + self.addCleanup(shutil.rmtree, self.tmp, ignore_errors=True) + + def inject_line_chart(self, **overrides: object) -> str: + arguments: dict[str, object] = { + "input_path": FIXTURES / "existing-workbook.twb", + "output_path": self.tmp / "output.twb", + "resource_id": "insights__line_chart", + "worksheet_name": "ARR Trend", + "datasource_name": FIXTURE_DATASOURCE, + "field_mappings": dict(LINE_MAPPINGS), + "parameters": {}, + } + arguments.update(overrides) + return inject_resource(**arguments) + + def run_cli(self, *args: str) -> subprocess.CompletedProcess[str]: + return subprocess.run( + [sys.executable, str(CLI), *args], + text=True, + capture_output=True, + check=False, + ) + + # --- required behaviors ------------------------------------------------- + + def test_inject_preserves_unrelated_bytes(self) -> None: + original = (FIXTURES / "existing-workbook.twb").read_text() + marker = "" + output = inject_resource( + input_path=FIXTURES / "existing-workbook.twb", + output_path=self.tmp / "output.twb", + resource_id="insights__line_chart", + worksheet_name="ARR Trend", + datasource_name=FIXTURE_DATASOURCE, + field_mappings={"ARR": "Revenue", "Close Date": "Transaction Date"}, + parameters={}, + ) + self.assertIn(marker, output) + self.assertEqual( + original[: original.index("")], + output[: output.index("")], + ) + + def test_instantiate_inserts_one_datasource_and_sheet(self) -> None: + output = instantiate_resource( + datasource_definition_path=FIXTURES / "target-datasource.xml", + output_path=self.tmp / "starter-output.twb", + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings={ + "ARR": "Revenue", + "Close Date": "Transaction Date", + "Product": "Offering", + }, + parameters={ + "DATE_MIN": "2026-01-01", + "DATE_MAX": "2026-06-30", + "DIRECTION": "DESC", + }, + ) + root = ET.fromstring(output) + self.assertEqual(len(root.find("datasources")), 1) + self.assertEqual(len(root.find("worksheets")), 1) + self.assertEqual(len(root.find("windows")), 1) + + def test_existing_output_requires_overwrite(self) -> None: + output = self.tmp / "existing.twb" + output.write_text("do not replace") + with self.assertRaisesRegex(ResourceError, "--overwrite"): + atomic_write(output, "new", overwrite=False) + self.assertEqual(output.read_text(), "do not replace") + + # --- datasource inspection and validation ------------------------------- + + def test_inspect_datasources_reports_only_global_datasource_columns(self) -> None: + text = (FIXTURES / "existing-workbook.twb").read_text() + self.assertEqual( + inspect_datasources(text), + {FIXTURE_DATASOURCE: {"Revenue", "Transaction Date", "Offering"}}, + ) + + def test_inspect_datasources_keys_on_internal_name_not_caption(self) -> None: + text = (FIXTURES / "existing-workbook.twb").read_text() + self.assertIn("caption='Sales Data'", text) + self.assertNotIn("Sales Data", inspect_datasources(text)) + + def test_inject_accepts_a_federated_target_datasource(self) -> None: + output = self.inject_line_chart() + self.assertIn(f"[{FIXTURE_DATASOURCE}].[sum:Revenue:qk]", output) + self.assertIn(f"datasource='{FIXTURE_DATASOURCE}'", output) + self.assertNotIn("Sample - Superstore", output) + + def test_inspect_datasources_rejects_a_non_workbook_document(self) -> None: + with self.assertRaisesRegex(ResourceError, ""): + inspect_datasources((FIXTURES / "target-datasource.xml").read_text()) + + def test_inject_rejects_a_datasource_the_workbook_does_not_have(self) -> None: + with self.assertRaisesRegex(ResourceError, "no datasource named Missing DS"): + self.inject_line_chart(datasource_name="Missing DS") + self.assertFalse((self.tmp / "output.twb").exists()) + + def test_inject_rejects_a_target_field_the_datasource_does_not_have(self) -> None: + with self.assertRaisesRegex(ResourceError, "Nonexistent Column"): + self.inject_line_chart( + field_mappings={ + "ARR": "Nonexistent Column", + "Close Date": "Transaction Date", + } + ) + self.assertFalse((self.tmp / "output.twb").exists()) + + def test_inject_rejects_a_reference_only_resource(self) -> None: + with self.assertRaisesRegex(ResourceError, "reference-only"): + self.inject_line_chart(resource_id=REFERENCE_ONLY_ID) + self.assertFalse((self.tmp / "output.twb").exists()) + + # --- bounded insertion -------------------------------------------------- + + def test_inject_places_the_window_beside_the_existing_window(self) -> None: + output = self.inject_line_chart() + root = ET.fromstring(output) + worksheets = [item.get("name") for item in root.findall("worksheets/worksheet")] + windows = [item.get("name") for item in root.findall("windows/window")] + self.assertEqual(worksheets, ["Existing Sheet", "ARR Trend"]) + self.assertEqual(windows, ["Existing Sheet", "ARR Trend"]) + self.assertEqual( + root.findall("windows/window")[1].get("class"), "worksheet" + ) + + def test_inject_preserves_every_byte_after_the_window_container(self) -> None: + original = (FIXTURES / "existing-workbook.twb").read_text() + output = self.inject_line_chart() + tail = original[original.index("") :] + self.assertTrue(output.endswith(tail)) + + def test_inject_preserves_crlf_bytes_outside_the_fragments(self) -> None: + source = self.tmp / "crlf-input.twb" + original = ( + (FIXTURES / "existing-workbook.twb").read_bytes().replace(b"\n", b"\r\n") + ) + source.write_bytes(original) + destination = self.tmp / "crlf-output.twb" + + self.inject_line_chart(input_path=source, output_path=destination) + + produced = destination.read_bytes() + self.assertEqual(source.read_bytes(), original) + self.assertIn(b"\r\n", produced) + opcodes = difflib.SequenceMatcher( + None, original, produced, autojunk=False + ).get_opcodes() + self.assertEqual(sorted({tag for tag, *_ in opcodes}), ["equal", "insert"]) + preserved = b"".join( + produced[start:end] + for tag, _i1, _i2, start, end in opcodes + if tag == "equal" + ) + self.assertEqual(preserved, original) + + def test_inject_rejects_a_duplicate_worksheet_name(self) -> None: + with self.assertRaisesRegex(ResourceError, "worksheet named Existing Sheet"): + self.inject_line_chart(worksheet_name="Existing Sheet") + + def test_inject_rejects_a_duplicate_window_name(self) -> None: + original = (FIXTURES / "existing-workbook.twb").read_text() + clashing = original.replace( + "", + "", + ) + with self.assertRaisesRegex(ResourceError, "window named ARR Trend"): + inject_fragments( + clashing, + "\n
\n", + "", + ) + + def test_inject_requires_exactly_one_worksheets_container(self) -> None: + original = (FIXTURES / "existing-workbook.twb").read_text() + doubled = original.replace( + "", "\n ", 1 + ) + with self.assertRaisesRegex(ResourceError, ""): + inject_fragments( + doubled, + "\n
\n", + "", + ) + + def test_inject_requires_a_windows_container(self) -> None: + original = (FIXTURES / "existing-workbook.twb").read_text() + start = original.index("") + end = original.index("") + len("") + without_windows = original[:start] + "" + original[end:] + with self.assertRaisesRegex(ResourceError, ""): + inject_fragments( + without_windows, + "\n
\n", + "", + ) + + # --- starter instantiation ---------------------------------------------- + + def test_instantiate_preserves_the_starter_prefix(self) -> None: + starter = STARTER.read_text() + output = instantiate_resource( + datasource_definition_path=FIXTURES / "target-datasource.xml", + output_path=self.tmp / "starter-output.twb", + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings=dict(BAR_MAPPINGS), + parameters=dict(BAR_PARAMETERS), + ) + self.assertTrue(output.startswith(starter[: starter.index("")])) + self.assertIn(" \n", output) + self.assertNotIn(" None: + for resource_id in ("magnitude-paired-bar", "magnitude-paired-column-chart"): + with self.subTest(resource_id=resource_id): + output_path = self.tmp / f"{resource_id}.twb" + output = instantiate_resource( + datasource_definition_path=FIXTURES / "target-datasource.xml", + output_path=output_path, + resource_id=resource_id, + worksheet_name="Profit by Offering", + field_mappings=dict(PAIRED_MAPPINGS), + parameters={}, + ) + self.assertIn("user:", output) + root = ET.fromstring(output) + self.assertEqual( + [item.get("name") for item in root.findall("worksheets/worksheet")], + ["Profit by Offering"], + ) + self.assertTrue(output_path.exists()) + + def test_starter_declares_the_tableau_user_namespace(self) -> None: + self.assertIn( + "xmlns:user='http://www.tableausoftware.com/xml/user'", + STARTER.read_text(), + ) + + def test_instantiate_rejects_a_workbook_definition(self) -> None: + definition = self.tmp / "workbook-definition.xml" + definition.write_text((FIXTURES / "existing-workbook.twb").read_text()) + with self.assertRaisesRegex(ResourceError, " element"): + instantiate_resource( + datasource_definition_path=definition, + output_path=self.tmp / "starter-output.twb", + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings=dict(BAR_MAPPINGS), + parameters=dict(BAR_PARAMETERS), + ) + self.assertFalse((self.tmp / "starter-output.twb").exists()) + + def test_instantiate_rejects_a_nested_datasource_definition(self) -> None: + definition = self.tmp / "nested-definition.xml" + definition.write_text( + "\n" + " \n" + "\n" + ) + with self.assertRaisesRegex(ResourceError, "exactly one"): + instantiate_resource( + datasource_definition_path=definition, + output_path=self.tmp / "starter-output.twb", + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings=dict(BAR_MAPPINGS), + parameters=dict(BAR_PARAMETERS), + ) + + def test_instantiate_rejects_an_unnamed_datasource_definition(self) -> None: + definition = self.tmp / "unnamed-definition.xml" + definition.write_text("\n") + with self.assertRaisesRegex(ResourceError, "name"): + instantiate_resource( + datasource_definition_path=definition, + output_path=self.tmp / "starter-output.twb", + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings=dict(BAR_MAPPINGS), + parameters=dict(BAR_PARAMETERS), + ) + + # --- atomic output ------------------------------------------------------ + + def test_atomic_write_replaces_the_destination_with_overwrite(self) -> None: + output = self.tmp / "existing.twb" + output.write_text("stale") + atomic_write(output, "fresh", overwrite=True) + self.assertEqual(output.read_text(), "fresh") + self.assertEqual([item.name for item in self.tmp.iterdir()], ["existing.twb"]) + + def test_atomic_write_keeps_the_destination_file_mode(self) -> None: + output = self.tmp / "existing.twb" + output.write_text("stale") + output.chmod(0o640) + atomic_write(output, "fresh", overwrite=True) + self.assertEqual(output.stat().st_mode & 0o777, 0o640) + + def test_inject_rejects_a_workbook_that_is_not_utf8(self) -> None: + source = self.tmp / "latin1.twb" + source.write_bytes( + (FIXTURES / "existing-workbook.twb") + .read_text() + .replace("Sales Data", "Ventas Espa\u00f1a") + .encode("latin-1") + ) + with self.assertRaisesRegex(ResourceError, "Cannot read workbook"): + self.inject_line_chart(input_path=source) + + def test_instantiate_refuses_to_replace_its_datasource_definition(self) -> None: + definition = self.tmp / "datasource.xml" + definition.write_text((FIXTURES / "target-datasource.xml").read_text()) + with self.assertRaisesRegex(ResourceError, "--overwrite"): + instantiate_resource( + datasource_definition_path=definition, + output_path=definition, + resource_id="insights__bar_chart", + worksheet_name="ARR by Offering", + field_mappings=dict(BAR_MAPPINGS), + parameters=dict(BAR_PARAMETERS), + ) + self.assertIn(" None: + source = self.tmp / "input.twb" + source.write_text((FIXTURES / "existing-workbook.twb").read_text()) + before = source.read_bytes() + with self.assertRaises(ResourceError): + self.inject_line_chart(input_path=source, field_mappings={"ARR": "Revenue"}) + self.assertEqual(source.read_bytes(), before) + self.assertEqual([item.name for item in self.tmp.iterdir()], ["input.twb"]) + + def test_inject_refuses_to_replace_its_own_input(self) -> None: + source = self.tmp / "input.twb" + source.write_text((FIXTURES / "existing-workbook.twb").read_text()) + before = source.read_bytes() + with self.assertRaisesRegex(ResourceError, "--overwrite"): + self.inject_line_chart(input_path=source, output_path=source) + self.assertEqual(source.read_bytes(), before) + + def test_inject_can_replace_its_own_input_with_overwrite(self) -> None: + source = self.tmp / "input.twb" + source.write_text((FIXTURES / "existing-workbook.twb").read_text()) + output = self.inject_line_chart( + input_path=source, output_path=source, overwrite=True + ) + self.assertEqual(source.read_text(), output) + self.assertIn("", source.read_text()) + + # --- CLI ---------------------------------------------------------------- + + def test_cli_inject_writes_the_transformed_workbook(self) -> None: + output = self.tmp / "workbook-with-trend.twb" + result = self.run_cli( + "inject", + "insights__line_chart", + "--input", + str(FIXTURES / "existing-workbook.twb"), + "--output", + str(output), + "--worksheet-name", + "ARR Trend", + "--datasource", + FIXTURE_DATASOURCE, + "--map", + "ARR=Revenue", + "--map", + "Close Date=Transaction Date", + ) + self.assertEqual(result.returncode, 0, result.stderr) + root = ET.fromstring(output.read_text()) + self.assertEqual( + [item.get("name") for item in root.findall("worksheets/worksheet")], + ["Existing Sheet", "ARR Trend"], + ) + + def test_cli_instantiate_writes_the_starter_workbook(self) -> None: + output = self.tmp / "starter-bar.twb" + result = self.run_cli( + "instantiate", + "insights__bar_chart", + "--datasource-definition", + str(FIXTURES / "target-datasource.xml"), + "--output", + str(output), + "--worksheet-name", + "ARR by Offering", + "--map", + "ARR=Revenue", + "--map", + "Close Date=Transaction Date", + "--map", + "Product=Offering", + "--param", + "DATE_MIN=2026-01-01", + "--param", + "DATE_MAX=2026-06-30", + "--param", + "DIRECTION=DESC", + ) + self.assertEqual(result.returncode, 0, result.stderr) + root = ET.fromstring(output.read_text()) + self.assertEqual(len(root.find("datasources")), 1) + self.assertEqual( + [item.get("name") for item in root.findall("worksheets/worksheet")], + ["ARR by Offering"], + ) + + def test_cli_reports_a_missing_mapping_without_a_traceback(self) -> None: + output = self.tmp / "workbook-with-trend.twb" + result = self.run_cli( + "inject", + "insights__line_chart", + "--input", + str(FIXTURES / "existing-workbook.twb"), + "--output", + str(output), + "--worksheet-name", + "ARR Trend", + "--datasource", + FIXTURE_DATASOURCE, + "--map", + "ARR=Revenue", + ) + self.assertEqual(result.returncode, 2) + self.assertIn("Missing field mappings: Close Date", result.stderr) + self.assertNotIn("Traceback", result.stderr) + self.assertFalse(output.exists()) + + def test_cli_refuses_an_existing_output_without_overwrite(self) -> None: + output = self.tmp / "workbook-with-trend.twb" + output.write_text("do not replace") + result = self.run_cli( + "inject", + "insights__line_chart", + "--input", + str(FIXTURES / "existing-workbook.twb"), + "--output", + str(output), + "--worksheet-name", + "ARR Trend", + "--datasource", + FIXTURE_DATASOURCE, + "--map", + "ARR=Revenue", + "--map", + "Close Date=Transaction Date", + ) + self.assertEqual(result.returncode, 2) + self.assertIn("--overwrite", result.stderr) + self.assertEqual(output.read_text(), "do not replace") + + +if __name__ == "__main__": + unittest.main()