Skip to content

Lists, layout, cards, and reusable fields

Client keyword reference / Lists, layout, cards, and reusable fields

IFS Cloud 26R1 · Documentation-based examples · Not compiled or executed in IFS.

Use this guide when data exists but appears in the wrong place or does not follow the selected parent. For each declaration, distinguish the type it displays from the collection used at the page insertion point.

  1. Expose a DemoRequest parent and a DemoRequestLine child with RequestId, LineNo, and Description.
  2. Define Lines in the projection as a relationship that includes every parent key, including company/site if part of your real key.
  3. Add the child list below the parent’s selector; bind identifies which control supplies selection.
  4. Select two requests with different lines. Add a line only in a disposable test record and verify its parent key.
// Inside RequestDetails, after selector RequestSelector:
list RequestLines(Lines) bind RequestSelector {
copyoncruddefault(RequestId) to(RequestId);
}
// File-scope declaration:
list RequestLines for DemoRequestLine {
label = "Work items";
orderby = LineNo asc;
multiselect = [false];
preselect = [false];
static LineNo;
field Description;
crudactions {
delete { enabled = [false]; }
}
}

If every request shows the same children, inspect the projection array mapping before adding a client filter. Disabling deletion does not revoke API delete permission. For a second child list bound to a parent list, display = Nested; can be set at the insertion point; first verify both arrays independently.

Put reusable fields at file scope, then insert fieldset RequestColumns; in a DemoRequest list.

fieldset RequestColumns for DemoRequest {
static RequestId;
field Title;
field EstimateHours;
}
groupingfieldset RequestGrouping for DemoRequest {
groupingfield Closed { selected = [true]; }
}
list RequestOverview for DemoRequest {
fieldset RequestColumns;
groupingfieldset RequestGrouping;
summary = EstimateHours;
fieldranking RequestId, Title, EstimateHours;
}

Expose two open records with 2 and 3 hours and one closed record with 4. Compare grouped results to those three records; investigate server aggregation and loaded-row behavior before claiming a grand total. To choose startup grouping in a supported grouping-fieldset context, use setgroupingstartup = [true]; and initialgrouping = Closed; after checking the target model grammar. fieldranking controls presentation priority; it does not sort records.

Define RequestSummary, RequestNotes, and RequestLines first. Place this inside the parent page:

tabs {
tab {
label = "Overview";
arrange {
group RequestSummary;
group RequestNotes;
}
}
tab {
label = "Work items";
list RequestLines(Lines) bind RequestSelector;
}
}

For a console with independently sized areas, replace that layout with the following fragment, supplying both list declarations and their correctly typed sources:

resizablearrange {
arrangeid = "request-console";
orientation = Horizontal;
height = auto;
list RequestOverview using DemoRequestSet;
list RequestLines using DemoRequestLineSet {
collapsed = [false];
}
}

The second list is an independent all-lines view, not automatically selected-request details. A panel { tabs { tab { label = "Queue"; list RequestOverview using DemoRequestSet; } } } adds a side panel where supported. Verify keyboard tab order, narrow screens, collapse/expand, and changed selection. Avoid duplicating editable controls for the same record across several visible containers.

  1. Create a card for DemoRequest and a sheet for DemoRequestLine.
  2. Attach the card to a request list with card RequestCard; and initialview = CardView;.
  3. Confirm the Lines array resolves from each card record and that the sheet contains only that request’s children.
card RequestCard for DemoRequest {
label = "${RequestId}";
field Title;
sheet RequestLineSheet(Lines) {
label = "Included work";
}
}
sheet RequestLineSheet for DemoRequestLine {
static LineNo;
static Description;
}

On a compatible LOV, preview = RequestCard; uses the card as a preview. A compact list can instead use initialview = TileView; with tile RequestOverview; where RequestOverview is its list definition. Cards, sheets, and tile views do not create independent storage; test record selection, empty arrays, and permissions against the same source data.

Use the build and acceptance checklist before delivering a change.