WebRADDocumentationExplore WebRAD ↗
WEBRAD / TECHNICAL REFERENCE

Repeating Group

Repeats a component template for each API item.

WebRepeatingGroupContainersVisual2 events

Quick start

Add RepeatingGroup1 in the Designer. Use the example in a page method.

RepeatingGroup1 · event
RepeatingGroup1.repeatingGroupConfig = {
  ...RepeatingGroup1.repeatingGroupConfig,
  gap: 12,
  rowHeightMode: 'dynamic',
  emptyMessage: 'No items',
};
await ApiClient1.execute('Load');
Message(RepeatingGroup1.rowCount);
  • Configure the API operation and listPath in the editor; children form a template for each item.
  • On each child, use Current row in the Inspector to bind a property to a field.
  • Child events receive CurrentRow typed by the operation schema. Use this context to act on the correct item.
  • Configure gap and fixed or dynamic height. rowCount and getRow(index) let you inspect mounted rows.

More examples

Complete list configuration
Complete list configuration
const operation = ApiClient1.operations.find(item => item.name === 'Load');
if (!operation) throw new Error('Configure the Load operation in the Designer.');
RepeatingGroup1.repeatingGroupConfig = {
  schemaVersion: 1,
  apiClientId: ApiClient1.id,
  operationId: operation.id,
  listPath: '/data',
  rowHeightMode: 'dynamic',
  fixedRowHeight: 80,
  minRowHeight: 32,
  maxRowHeight: null,
  gap: 12,
  emptyMessage: 'No customers',
};
RepeatingGroup1.bindApiClient(ApiClient1);
await ApiClient1.execute('Load');
Interaction for a Button inside the template
Interaction for a Button inside the template
import type { WebButton, WebRepeatingGroupCurrentRow } from '@webrad/runtime';
// This example’s Load schema contains items with id:number and name:string.
// The IDE generates the concrete signature; copy the body into your generated method.
class Example {
  public async OpenCustomer(
    sender: WebButton,
    event: Event,
    CurrentRow: WebRepeatingGroupCurrentRow<{ id: number; name: string }>,
  ): Promise<void> {
    Message(CurrentRow.value.name);
    console.log(CurrentRow.index, CurrentRow.value.id);
  }
}

Inspector properties

Component options and defaults. Fields without runtime access are configured in the Inspector.

Property / sourceType and optionsDefaultRuntime access
nameName · Identitystring—name
xLeft · Size & positionnumber0x
yTop · Size & positionnumber0y
widthWidth · Size & positionnumber420width
heightHeight · Size & positionnumber320height
itemWidthResponsive width · Responsive sizeFit content grows the item to its widest rendered child and preserves child intrinsic widths; minimum and maximum width remain limits.enumfixed stretch fit-content"fixed"Inspector / configuration
itemHeightResponsive height · Responsive sizeFit content grows the item to its lowest rendered child and preserves child intrinsic heights; minimum and maximum height remain limits.enumfixed stretch fit-content"fixed"Inspector / configuration
itemMinWidthMinimum width · Responsive sizenumber0Inspector / configuration
itemMaxWidthMaximum width · Responsive sizenumbernullInspector / configuration
itemMinHeightMinimum height · Responsive sizenumber0Inspector / configuration
itemMaxHeightMaximum height · Responsive sizenumbernullInspector / configuration
itemGrowGrow · Responsive sizenumber0Inspector / configuration
itemShrinkShrink · Responsive sizeAllows fixed and stretch flow items to yield space. Fit-content keeps its intrinsic size so its children are not compressed.booleantrueInspector / configuration
itemAlignSelfItem alignment · Responsive sizeCross-axis alignment for this item in a row or column. Auto inherits the parent alignment; responsive cross-axis stretch retains its sizing behavior.enumauto start center end stretch"auto"Inspector / configuration
itemHorizontalAnchorHorizontal anchor · Anchors & offsetsenumstart center end stretch"start"Inspector / configuration
itemVerticalAnchorVertical anchor · Anchors & offsetsenumstart center end stretch"start"Inspector / configuration
itemLeftLeft inset · Anchors & offsetsnumber0Inspector / configuration
itemRightRight inset · Anchors & offsetsnumber0Inspector / configuration
itemTopTop inset · Anchors & offsetsnumber0Inspector / configuration
itemBottomBottom inset · Anchors & offsetsnumber0Inspector / configuration
marginMargin · SpacingOuter spacing on all four sides, in pixels. Row and column layouts include this spacing between components.number0margin
marginTopMargin top · SpacingOuter spacing on this side, in pixels. Overrides the shared Margin value.number0Derived from saved propertiesmarginTop
marginRightMargin right · SpacingOuter spacing on this side, in pixels. Overrides the shared Margin value.number0Derived from saved propertiesmarginRight
marginBottomMargin bottom · SpacingOuter spacing on this side, in pixels. Overrides the shared Margin value.number0Derived from saved propertiesmarginBottom
marginLeftMargin left · SpacingOuter spacing on this side, in pixels. Overrides the shared Margin value.number0Derived from saved propertiesmarginLeft
visibleVisible · Behaviorbooleantruevisible
collapseWhenHiddenCollapse when hidden · BehaviorRemoves the component from the layout while it is not visible.booleantruecollapseWhenHidden
enabledEnabled · Behaviorbooleantrueenabled
containerModeContainer layout · Children layoutenumfixed align-to-parent row column"fixed"Inspector / configuration
containerPaddingTopPadding top · Children layoutnumber0Inspector / configuration
containerPaddingRightPadding right · Children layoutnumber0Inspector / configuration
containerPaddingBottomPadding bottom · Children layoutnumber0Inspector / configuration
containerPaddingLeftPadding left · Children layoutnumber0Inspector / configuration
containerGapGap · Children layoutnumber0Inspector / configuration
containerWrapWrap · Children layoutbooleanfalseInspector / configuration
containerJustifyContentJustify content · Children layoutenumstart center end space-between space-around"start"Inspector / configuration
containerAlignItemsDefault alignment · Children layoutDefault cross-axis alignment for children. Each child can override it with Item alignment.enumstart center end stretch"start"Inspector / configuration
repeatingGroupConfigData source and rows · Repeating GroupChoose the API response list and row sizing. Children form one responsive row template.repeating-group-configEditor: repeating-group-configurator{"schemaVersion":1,"apiClientId":null,"operationId":null,"listPath":"","rowHeightMode":"dynamic","fixedRowHeight":120,"minRowHeight":80,"maxRowHeight":null,"gap":8,"emptyMessage":"No data"}repeatingGroupConfig
currentRowBindingsCurrent row · DataBind writable visual values to fields of this repeated row.current-row-bindingsEditor: current-row-bindings[]currentRowBindings

API in code

MemberSignatureAccess
repeatingGroupConfigget repeatingGroupConfig(): WebRepeatingGroupConfiguration;Read and write
rowsget rows(): readonly T[];Read and write
rowCountget rowCount(): number;Read-only

getRow

method
getRow(index: number): WebRepeatingGroupRow<T>;
Example
RepeatingGroup1.getRow
if (RepeatingGroup1.rowCount > 0) {
  const row = RepeatingGroup1.getRow(0);
  console.log(row.index, row.value);
}

getTemplateHost

method
getTemplateHost(): HTMLElement;

The Designer uses one editable host without serializing sampled row data.

Example
RepeatingGroup1.getTemplateHost
RepeatingGroup1.getTemplateHost();

configureRowTemplate

method
configureRowTemplate(renderer: WebRepeatingGroupRowRenderer): void;

Runtime renderer owns creation; authored code only supplies values.

Example
RepeatingGroup1.configureRowTemplate
// Advanced API used by the renderer. In generated pages, edit children in the Designer.
const configure = RepeatingGroup1.configureRowTemplate.bind(RepeatingGroup1);
// configure takes WebRepeatingGroupRowRenderer; the renderer creates one instance per row.
console.log(configure);

bindApiClient

method
bindApiClient(apiClient: WebApiClient | null): void;

Observes completed API results; it never executes an operation itself.

Example
RepeatingGroup1.bindApiClient
RepeatingGroup1.bindApiClient(ApiClient1);

subscribeRows

method
subscribeRows(listener: WebRepeatingGroupRowListener<T>): () => void;
Example
RepeatingGroup1.subscribeRows
RepeatingGroup1.subscribeRows(rows => console.log(rows));

dispose

method
dispose(): void;
Example
RepeatingGroup1.dispose
// Call only when disposing of an instance whose lifecycle you control.
RepeatingGroup1.dispose();
Inherited members (26)
MemberSignatureAccess
currentRowBindingscurrentRowBindings: readonly WebCurrentRowBinding[];Read and write
elementreadonly element: TElement;Read-only
idreadonly id: string;Read-only
namereadonly name: string;Read-only
visiblevisible: boolean;Read and write
collapseWhenHiddencollapseWhenHidden: boolean;Read and write
enabledenabled: boolean;Read and write
xx: number;Read and write
yy: number;Read and write
widthwidth: number;Read and write
heightheight: number;Read and write
marginOuter spacing on all four sides, in pixels.margin: number;Read and write
marginTopmarginTop: number;Read and write
marginRightmarginRight: number;Read and write
marginBottommarginBottom: number;Read and write
marginLeftmarginLeft: number;Read and write
alignSelfalignSelf: RuntimeLayoutAlignSelf;Read and write
tabIndextabIndex: number;Read and write
backgroundColorbackgroundColor: string;Read and write
colorcolor: string;Read and write
borderColorborderColor: string;Read and write

focus

method
focus(options?: FocusOptions): void;

show

method
show(): void;

hide

method
hide(): void;

bindEvent

method
bindEvent(eventName: string, handler: WebComponentEventHandler<this> | null): () => void;

emit

method
emit(eventName: string, detail?: unknown): boolean;

Events

Link methods in Interaction. How to use events.

OnClick

Standard event (Event).

Signature and example
Interaction → OnClick
import type { WebRepeatingGroup } from '@webrad/runtime';
// Copy this method into the page class and link it in Interaction.
class Example {
  public async RepeatingGroup1Click(
    sender: WebRepeatingGroup,
    event: Event,
  ): Promise<void> {
    console.log(sender.name, event.type);
  }
}

OnDblClick

Standard event (Event).

Signature and example
Interaction → OnDblClick
import type { WebRepeatingGroup } from '@webrad/runtime';
// Copy this method into the page class and link it in Interaction.
class Example {
  public async RepeatingGroup1DblClick(
    sender: WebRepeatingGroup,
    event: Event,
  ): Promise<void> {
    console.log(sender.name, event.type);
  }
}
WebRAD · Atentor · Read in Markdown
Source code: 6a562bda75a0 (with local changes) · November 7, 2026

Search documentation

Type to search APIs, components, and events.