Skip to content
GitHub

Table

Table manifests describe tables bound to datasets. They control formatting, grouping, scenarios, and optional drilldown views.

apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
  name: revenue_table
spec:
  dataset: revenue_by_customer
  filter: "region = 'DE'"
  order: ac1                         # category | categoryindex | rowgroup | rowgroupindex | ac1-4 | fc1-4 | pp1-4 | pl1-4 | auto
  orderDirection: desc
  measureScale: M
  measureType: currency              # volume | currency
  measureUnit: "EUR"
  internationalisation: "_system"
  internationalisationMode: "default"
  translation: "table.revenue.by_customer"
  categoryWidth: w25                 # w5 | w10 | w15 | w20 | w25 | w50 | inf
  dataFormat: decimal                # percent | decimal
  dataFormatDigitsDecimal: 1
  dataFormatDigitsPercent: 1
  grouped: true
  showGroupTitle: true
  showMeasureScale: true
  limit: 10
  type: list                         # list | sum | opt | sumnototal | optnototal
  sumTitle: "Total"                  # label of the grand-total row; only rendered for type sum | opt
  scenarios: ["ac1", "py1"]          # ac1-4 | fc1-4 | pp1-4 | pl1-4 | auto
  variances: ["dpy1_ac1_pos"]
  barColumns: []                     # columns to render as inline bar charts
  barColumnWidth: w10                # w5 | w10 | w15 | w20 | w25 | w30 | w40 | w60 | w80 | w100
  scale: auto                        # "" | none | auto | 0.5 | 1.2 | …
  unitScaling: 0.01                  # pixels per unit for absolute variance bars
  percentageScaling: 0.5             # pixels per percentage for relative variance pins
  thereof: []
  partof: []
  columnthereof: null
  interval: none                     # none | setname | year | quarter | month | week | day | hour | minute | second | millisecond | auto
  attributes: []                     # computed attribute columns (label + expression)
  selectedStyle: corporate-style     # name of a ComponentStyle to apply
  ruleset: corporate-rules           # name of a RuleSet to apply
  • dataset – required dataset reference.
  • filter – optional filter expression.
  • order – sort key; using scenario names requires them to appear in scenarios. Set to auto to detect from the dataset silently. Default: category.
  • orderDirection – sort direction (asc or desc).
  • measureScale, measureType, measureUnit – control how measures are interpreted and displayed.
  • categoryWidth – width of the category column (w5..w50, inf).
  • dataFormat, dataFormatDigitsDecimal, dataFormatDigitsPercent – number formatting.
  • grouped, showGroupTitle – group rows by rowgroup and optionally show group headers.
  • showMeasureScale – toggle measure unit in table header.
  • limit – maximum rows per group; extra rows are cumulated as REST.
  • type – table type (list, sum, opt, sumnototal, optnototal). Only sum and opt render a grand-total row at the bottom of the table.
  • sumTitle – label of that grand-total row. It is not a title above the table: it is the text in the category cell of the total row. Since the other table types render no total row, they ignore the value. When empty, the row is labelled with the IBCS grand-total symbol ❖.
  • scenarios – list of scenario measures, or auto. When set to auto, scenarios are detected from the dataset silently. When left blank (and variances are also blank), they are detected with a warning.
  • variances – list of variance definitions of the form d<scenarioB>_<scenarioA>_[pos|neg|neu].
  • barColumns – list of column names to render as inline IBCS-compliant bar charts instead of numbers.
  • barColumnWidth – maximum width of inline bar/pin chart columns in em (w5..w100). Default: w10.
  • unitScaling – pixels per unit for absolute variance bars (d_ prefix columns). Default: 0.01.
  • percentageScaling – pixels per percentage point for relative variance pins (dr_ prefix columns). Default: 0.5.
  • scale – proportional scaling of the entire table (font size, em-based spacing, SVG bar charts, pins, patterns). All visual dimensions scale together.
    • not set or "" – auto-scale to fit the parent width; emits an AUTO_scale warning with the applied factor.
    • "none" – no scaling; render at the base font size regardless of available space.
    • "auto" – auto-scale to fit the parent width silently (no warning).
    • A positive number ("0.5", "1.2", …) – fixed factor applied to the base font size.
  • thereof, partof, columnthereof – drilldown configuration.
  • interval – repeats the entire scenario/variance column block once per interval group, rendered under a spanning header band. Values: none (default), setname, or a date granularity (year, quarter, month, week, day, hour, minute, second, millisecond, auto). Mutually exclusive with columnthereof (columnthereof wins). See Interval column grouping.
  • attributes – computed attribute columns rendered between the category and scenario columns; ordered list of {label, expression} pairs. See Computed attribute columns.
  • selectedStyle – optional name of a ComponentStyle to apply; merged over the _system and _default styles.
  • ruleset – optional name of a RuleSet to apply, or inherited-closest / inherited-page to inherit the surrounding layout's rule set; merged over the _system and _default rule sets.
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
  name: revenue_grouped_table
spec:
  dataset: revenue_detail
  measureScale: M
  measureType: currency
  measureUnit: "EUR"
  grouped: true
  showGroupTitle: true
  categoryWidth: w25
  type: list
  limit: 5
  scenarios: ["ac1", "py1"]
  variances: ["dpy1_ac1_pos"]
  thereof:
    - rowGroup: "Revenue"
      category: "Applications"
      subCategory: "Applications-A"
  partof:
    - rowGroup: "Revenue"
      category: "Applications"
  columnthereof:
    - scenario: "ac1"
      name: "DE"
      subGroups: ["Berlin", "Hamburg"]

attributes adds custom columns computed from dataset fields, rendered between the category column and the scenario columns. Each entry maps a column header label to an aggregate expression evaluated over the dataset rows behind each table row:

---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
  name: revenue_with_attributes
spec:
  dataset: revenue_by_region
  scenarios: ["ac1", "pp1"]
  grouped: true
  type: sum
  attributes:
    - label: "Verkaufsleiter"
      expression: "set(_leiter)"
    - label: "Umsatz gesamt"
      expression: "sum(ac1)"

The list order defines the column order. Alternatively, a raw JSON object string can be used; its key order defines the column order:

  attributes: '{"Verkaufsleiter": "set(_leiter)", "Umsatz gesamt": "sum(ac1)"}'
FunctionResult
set(field)All distinct values in the group, joined with ", ".
first(field)Value of the first row in the group.
last(field)Value of the last row in the group.
min(field), max(field)Numeric minimum/maximum.
avg(field), sum(field)Numeric average/sum; respects the row operation sign.
lit(value)Constant value rendered in every row.

Notes:

  • Field arguments must be plain identifiers ([A-Za-z_][A-Za-z0-9_]*): standard dataset fields (e.g. ac1) or custom fields prefixed with _ (e.g. _leiter). Custom fields pass through datasources and datasets as extra row columns. lit accepts any non-empty constant.
  • Results of min, max, avg, and sum are formatted like scenario cells (measure scale and decimal digits); other functions render as-is.
  • Cells stay blank on total and group-header rows (SUM, GROUP_SUM, GROUPHEAD, REST, PARTELEMENT). On thereof drill rows, aggregates are computed over the drilled subset.
  • Invalid entries are ignored and produce a component warning. Duplicate labels collapse (the last one wins).
  • Requires template engine v1.0.0-alpha.15 or newer; older engines silently ignore the attribute.

Render variance and scenario columns as inline IBCS-compliant bar charts using barColumns:

---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
  name: revenue_with_bars
spec:
  dataset: revenue_by_segment
  measureScale: M
  measureUnit: "EUR"
  scenarios: ["ac1", "pp1"]
  variances: ["dac1_pp1_pos", "drac1_pp1_pos"]
  barColumns: ["dac1_pp1_pos", "drac1_pp1_pos"]
  unitScaling: 0.02
  percentageScaling: 1
Column prefixVisualizationDescription
d_ (absolute variance)Horizontal barBar extends left (negative) or right (positive) from center axis. Green for positive-good, red for negative-bad.
dr_ (relative variance)Pin/dot chartThin colored line from axis with dot at end. Arrow for extreme values (>100%). Italic percentage label.
ac, pp, fc, pl (scenarios)IBCS grayscale bars, or an IBCS waterfall when grouping structure is present (see below)AC: dark gray solid, PP: light gray solid, FC: dark gray hatched, PL: dark gray outlined.
---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
  name: scenario_bars
spec:
  dataset: quarterly_data
  scenarios: ["ac1", "pp1", "fc1"]
  barColumns: ["ac1", "pp1", "fc1"]

When a scenario column listed in barColumns appears on a table with grouping structure (type: sum/opt, or thereof/partof drilldowns), it automatically renders as an IBCS waterfall instead of plain grayscale bars: data rows cascade from the running total and sum rows anchor at zero.

---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
  name: revenue_waterfall
spec:
  dataset: revenue_by_segment
  grouped: true
  type: sum
  sumTitle: "Revenue waterfall"
  scenarios: ["ac1"]
  barColumns: ["ac1"]
  thereof:
    - rowGroup: "Revenue"
      category: "Applications"
      subCategory: "Applications-A"

Notes:

  • Waterfall columns auto-scale to fit barColumnWidth; unitScaling does not apply to them (it only affects d_-prefixed absolute variance bars).
  • Not supported in combination with interval or columnthereof — scenario columns on tables using either of those fall back to plain grayscale bars.

interval repeats the entire configured scenario/variance column block once per interval group, rendered under a spanning header band (e.g. 2023 | 2024 | 2025, each with the same columns):

---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
  name: revenue_by_year
spec:
  dataset: revenue_by_year
  scenarios: ["ac1"]
  variances: ["dac1_pp1_pos"]
  barColumns: ["dac1_pp1_pos"]
  interval: year

Values:

ValueBehaviour
none (default)Feature disabled.
setnameGroups by the dataset's setname column (non-date comparison). Rows with a blank setname are grouped under a bucket. Blocks are ordered by first appearance in the data.
year, quarter, month, week, day, hour, minute, second, millisecondBuckets rows by the dataset's date column at the given granularity.
autoDetects the date granularity from the dataset's date span.

interval and columnthereof are mutually exclusive; if both are set, columnthereof wins and interval is ignored. A date-based interval on a dataset with no date values is likewise ignored.

Use scale to shrink or grow the entire table proportionally. Font size, em-based padding, border widths, SVG bar charts, pin lengths, dot radii, and hatch patterns all scale together.

---
apiVersion: bino.bi/v1alpha1
kind: Table
metadata:
  name: scaled_table
spec:
  dataset: revenue_by_segment
  scenarios: ["ac1", "pp1"]
  scale: auto           # shrink to fit the available card width
ValueBehaviour
not set / ""Auto-scale to fit the parent width. Emits an AUTO_scale warning with the applied factor.
noneNo scaling. The table renders at its base font size regardless of available space.
autoAuto-scale to fit the parent width silently (no warning).
0.5, 1.2, …Fixed factor applied to the base font size. All dimensions scale proportionally.

Instead of repeating scenarios, variances, order, and orderDirection on every component, you can inherit them from an ancestor LayoutPage or LayoutCard. Set any of these fields to a special keyword:

ValueResolves from
inherited-closestNearest ancestor LayoutCard or LayoutPage
inherited-pageNearest ancestor LayoutPage only (skips cards)

The inherited value is read from the ancestor's corresponding titleScenarios, titleVariances, titleOrder, or titleOrderDirection field. If no ancestor is found, the component falls back to its normal auto-detection logic.

children:
  - kind: Table
    spec:
      dataset: revenue_data
      grouped: true
      type: sum
      scenarios: inherited-page       # uses page's titleScenarios
      variances: inherited-page       # uses page's titleVariances

See the ChartStructure inherited props section for full examples.

AttributeTypeRequiredDefaultDescription
apiVersionstringyesMust be bino.bi/v1alpha1.
kindstringyesMust be Table.
metadata.namestringyesUnique identifier.
metadata.labelsobjectnoKey-value pairs for categorization and constraint matching.
metadata.annotationsobjectnoArbitrary key-value metadata, not used by the system.
metadata.descriptionstringnoFree-form description.
metadata.constraintsarraynoConditional inclusion rules. See Constraints.
AttributeTypeRequiredDefaultDescriptionSample
spec.datasetstring or objectyesDataset reference (name or inline definition). Provided by the withDataset mixin in the template engine.dataset: revenue_by_customer
spec.filterstringno""AlaSQL WHERE clause fragment to filter rows before rendering.filter: "region = 'DE'"
spec.orderstringnocategorySort key. Values: category, categoryindex, rowgroup, rowgroupindex, ac1ac4, fc1fc4, pp1pp4, pl1pl4, auto, inherited-closest, inherited-page.order: ac1
spec.orderDirectionstringnoascSort direction. Values: asc, desc, inherited-closest, inherited-page.orderDirection: desc
spec.measureScalestringnogreatestSI prefix for measure scaling. Values: _, k, M, G, T, P, E, Z, Y, m, μ, n, p, f, a, z, y, GREATEST, LEAST.measureScale: M
spec.measureTypestringnovolumeMeasure interpretation. Values: volume, currency.measureType: currency
spec.measureUnitstringno""Unit string displayed in headers.measureUnit: "EUR"
spec.categoryWidthstringnow15Width of the category column. Values: w5, w10, w15, w20, w25, w50, inf.categoryWidth: w25
spec.dataFormatstringnodecimalNumber formatting. Values: percent, decimal.dataFormat: decimal
spec.dataFormatDigitsDecimalintegerno1Number of decimal digits in table cells.dataFormatDigitsDecimal: 2
spec.dataFormatDigitsPercentintegerno2Number of percent digits in table cells.dataFormatDigitsPercent: 1
spec.groupedbooleannofalseGroup rows by rowGroup dimension.grouped: true
spec.showGroupTitlebooleannotrueShow group header rows when grouped.showGroupTitle: true
spec.showMeasureScalebooleannofalseToggle measure unit in table header.showMeasureScale: true
spec.limitintegerno0Maximum rows per group. Extra rows are cumulated as REST. 0 means unlimited.limit: 10
spec.typestringnolistTable type. Values: list, sum, opt, sumnototal, optnototal. Only sum and opt render a grand-total row.type: sum
spec.sumTitlestringnoLabel of the grand-total row at the bottom of the table (not a title above it). Ignored by the table types that render no total row. Empty renders the IBCS grand-total symbol ❖. Maps to the sum-title HTML attribute.sumTitle: "Total"
spec.scenariosstring or arraynoScenario measures to display. Values: ac1ac4, fc1fc4, pp1pp4, pl1pl4, auto, inherited-closest, inherited-page.scenarios: ["ac1", "py1"]
spec.variancesstring or arraynoVariance definitions. Pattern: d<scenarioB>_<scenarioA>_[pos|neg|neu]. Also accepts inherited-closest or inherited-page.variances: ["dpy1_ac1_pos"]
spec.barColumnsstring or arraynoColumn names to render as inline IBCS-compliant bar/pin charts.barColumns: ["dac1_pp1_pos"]
spec.barColumnWidthstringnow10Maximum width of inline bar chart columns. Values: w5, w10, w15, w20, w25, w30, w40, w60, w80, w100.barColumnWidth: w20
spec.unitScalingnumberno0.01Pixels per unit for absolute variance bars (d_ prefix columns).unitScaling: 0.02
spec.percentageScalingnumberno0.5Pixels per percentage point for relative variance pins (dr_ prefix columns).percentageScaling: 1
spec.scalestring or numbernoauto-scale with warningProportional scaling of the entire table. "" or omitted: auto-scale with warning. "none": no scaling. "auto": auto-scale silently. Positive number: fixed factor.scale: auto
spec.internationalisationstringnoi18n namespace for the table. Maps to the internationalisation HTML attribute.internationalisation: "_system"
spec.internationalisationModestringnoi18n mode. Maps to the internationalisation-mode HTML attribute.internationalisationMode: "default"
spec.translationstringnoTranslation key prefix for table labels.translation: "table.revenue"
spec.thereofstring or arrayno[]Drilldown rows (subCategory level).see below
spec.partofstring or arrayno[]Part-of groupings (category level).see below
spec.columnthereofstring, array, or nullnonullColumn-level drilldown configuration.see below
spec.intervalstringnononeRepeats the scenario/variance column block once per interval group. Values: none, setname, year, quarter, month, week, day, hour, minute, second, millisecond, auto. Mutually exclusive with columnthereof. See Interval column grouping.interval: year
spec.attributesstring or arraynoComputed attribute columns (header label → aggregate expression). See Computed attribute columns.see below
spec.selectedStylestringnoName of a ComponentStyle manifest to apply. Merged over the _system and _default styles. Maps to the selected-style HTML attribute.selectedStyle: corporate-style
spec.rulesetstringnoName of a RuleSet manifest to apply, or inherited-closest / inherited-page to inherit the surrounding layout's rule set. Merged over the _system and _default rule sets. Maps to the ruleset HTML attribute.ruleset: corporate-rules
spec:
  thereof:
    - rowGroup: "Revenue"
      category: "Applications"
      subCategory: "Applications-A"
spec:
  partof:
    - rowGroup: "Revenue"
      category: "Applications"
spec:
  columnthereof:
    - scenario: "ac1"
      name: "DE"
      subGroups: ["Berlin", "Hamburg"]
spec:
  attributes:
    - label: "Verkaufsleiter"
      expression: "set(_leiter)"
    - label: "Umsatz gesamt"
      expression: "sum(ac1)"