Skip to content

Group panel

Purpose and problems it solves

group composes several child panels into one ordered split. Use it to build master-detail screens, dashboards, or stacked work areas while keeping each child's own configuration and behavior independent.

When to use it

Use group when multiple panels must be visible at the same time. Use Tabs when users should see one child at a time, or Condition when exactly one branch should be chosen from state.

Choose columns for side-by-side work and rows for vertical stacking. The words describe the child arrangement: columns produces a horizontal splitter, while rows produces a vertical splitter.

Prerequisites, inputs, and ownership

Every child needs a unique id and a registered panel type. Child configuration remains owned by that variant. The group only owns ordering, orientation, conditional inclusion, and each child's share of the split.

Capability map

  • Recursive composition: panels may contain any registered panel, including another group, tabs, or condition panel.
  • Orientation: groupLayout.type chooses side-by-side columns or stacked rows.
  • Child sizing: panelLayout.size.value and min belong to each child and are passed to the splitter as its initial and minimum relative sizes.
  • Conditional children: children with condition are filtered before rendering. This uses Group/Tabs filtering semantics, not Condition-panel branch semantics.
  • Independent behavior: requests, selection, actions, empty states, and events stay with their child panels.

Behavioral model and interactions

Children render in array order. Filtering happens first, so a hidden child no longer occupies a splitter pane. The remaining children are rendered recursively through the common panel renderer.

Conditions on group children support variables and objectSelected. Unconditioned children remain visible. A child marked scenario: "default" is not a fallback in a group and is filtered out; default only has branch meaning inside a condition panel. An objectSelected child may set objectTypeNames to require an exact selected-object metatype, using the same matcher as Condition and Tabs.

Sizing is local to the current group level. A size on a nested panel affects its immediate parent group, not every ancestor.

Alternatives, defaults, and precedence

  • groupLayout.type is required by the declared type. Runtime treats anything other than columns as the vertical rows layout; do not rely on that fallback.
  • Omitted panels produces an empty splitter.
  • Omitted child sizes let the splitter distribute available space.
  • When conditions remove children, array order among the surviving children is preserved.

Limitations and runtime drift

  • groupLayout.resizable is declared and adds a class, but the CSS that would disable or restyle resizing is commented out. It does not currently provide a dependable configuration contract.
  • Group does not add a title, loading state, or actions of its own.
  • Group does not coordinate child requests. Cross-panel behavior requires explicit events and request bindings.

Minimal valid configuration

json
{
  "id": "work-area",
  "type": "group",
  "groupLayout": {
    "type": "columns"
  },
  "panels": []
}

Realistic end-to-end scenario

This root keeps instructions above an object table. The first child's sizing is relative to this group only. The backend must expose the WorkOrder meta type.

json
{
  "id": "work-orders-screen",
  "type": "group",
  "groupLayout": {
    "type": "rows"
  },
  "panels": [
    {
      "id": "work-orders-help",
      "type": "message",
      "panelLayout": {
        "size": {
          "value": 20,
          "min": 12
        }
      },
      "content": {
        "heading": {
          "ru": "Рабочие заказы",
          "en": "Work orders"
        },
        "text": {
          "ru": "Выберите строку, чтобы продолжить работу.",
          "en": "Select a row to continue."
        }
      }
    },
    {
      "id": "work-orders-table",
      "type": "table",
      "panelLayout": {
        "size": {
          "value": 80,
          "min": 35
        }
      },
      "request": {
        "metaTypeName": "WorkOrder"
      },
      "columns": [
        {
          "attribute": "itemId",
          "label": "Номер",
          "fixedWidth": "8rem"
        },
        {
          "attribute": "name",
          "label": "Наименование"
        }
      ]
    }
  ]
}

Verified demos

Open an ordered message-and-table group Open a vertically sized group

The current fixtures demonstrate composition and child sizes. They do not prove that resizable disables resizing.

Exact parameter reference

Continue with common panel configuration, then choose Tabs or Condition if children should not all remain visible.