Track table-formatting capabilities seen in major BI tools and define Dataface support status and config mapping.
Legend:
- M2: planned for first-pass implementation
- Partial: partial/limited support in M2
- Later: defer beyond M2
| Capability | Seen in other BI tools | Dataface status | Dataface mapping / approach |
|---|---|---|---|
| Hide/show columns | Tableau, Looker, Metabase, Superset | M2 | style.columns.<id>.hidden |
| Column header title override | Tableau, Looker, Metabase | M2 | style.columns.<id>.header.title |
| Column alignment | Tableau, Looker, Metabase, Superset | M2 | style.columns.<id>.header.align, style.columns.<id>.value.align |
| Text wrap/truncation behavior | Tableau, Metabase, Looker | Partial | Start with style.columns.<id>.value.wrap; advanced truncation modes later |
| Number formatting | Tableau, Looker, Metabase, Superset | M2 | style.columns.<id>.value.* aligned with Vega-Lite format / formatType (shared Python formatter with charts) |
| Currency formatting | Tableau, Looker, Metabase | M2 | Same Vega-Lite-shaped fields as charts (exact mapping in schema docs) |
| Date/time formatting | Tableau, Looker, Metabase | M2 | Same Vega-Lite-shaped fields as charts |
| Prefix/suffix/unit display | Tableau, Looker, Metabase | M2 | style.columns.<id>.value.number.prefix/suffix |
| Column-level links | Looker, Metabase, Superset | M2 | style.columns.<id>.link (static URL, template, or column ID) |
| Text column linked by URL column | Common modeling pattern across BI stacks | M2 | style.columns.<text_col>.link: <url_col> (column ID resolution) |
| Row-level URL variation | Looker/Metabase style row-context navigation | M2 | Column ID on link and/or URL templates with row column placeholders |
| Row click action (entire row clickable) | Some BI/table libs | Later | Defer to avoid interaction conflicts in M2 |
| Cell-level arbitrary renderer overrides | Table libraries (AG Grid/Tabulator/MUI) | Later | Avoid arbitrary render hooks in M2 JSON config |
| In-cell data bars | Looker, Metabase, Superset (CELL_BAR) |
M2 | style.columns.<id>.visual.type=bar |
| In-cell sparklines | Table libraries + existing Dataface support | M2 | style.columns.<id>.visual.type=sparkline |
| Conditional formatting rules engine | Tableau, Looker, Metabase, Superset | Later | M2 keeps logic in query/data layer |
| Style from another column (color map) | Common via calculated fields / callbacks | M2 | style.columns.<target>.style.textColor, backgroundColor, … with value = source column ID |
| Query-side templated style/link helpers (e.g., Jinja-generated CASE columns) | Common in SQL-first BI workflows | M2 | Compute helper columns in query, then reference column IDs in unified style/link fields |
| Text color from another column | Tableau/Looker style conditional output | M2 | style.columns.<target>.style.textColor: <source_col> |
| Font weight from another column | Table libraries via class/style callbacks | M2 | style.columns.<target>.style.fontWeight: <source_col> |
| Heatmap / color scale rule engine | Tableau, Looker, Metabase color ranges | Later | M2 requires precomputed color in data |
| Header background/font style | Tableau, Looker | Partial | Basic header typography/color in M2; richer theming later |
| Row/column banding | Tableau | Partial | Basic table-level zebra in style.table.zebra; advanced banding later |
| Entire-row background from data | Superset ENTIRE_ROW, Metabase row styles |
M2 | style.table.rowBackgroundColor: <col> (column-ID-first); query supplies color per row |
| Border/divider fine controls | Tableau | Later | Keep minimal grid line controls in M2 |
| Totals/subtotals formatting controls | Tableau, Looker | Later | Handle via query + existing table rendering for now |
| Dashboard-specific table destinations | Metabase, Looker | Later | Out of M2 formatting scope |
| Detail view/entity drill modal behavior | Metabase/Looker drill flows | Later | Separate drill/navigation initiative |
CELL_BAR and ENTIRE_ROW in recent changes.style.columns.<id> keeps syntax tight.