Manage child records inline — no second form, no leaving the page.
A Repeating Section shows related child-list items as an editable table right inside the parent form. Users add, edit, and delete rows in place — perfect for line items, sub-tasks, contacts, or any one-to-many data.
Key capabilities
- Inline add / edit / delete — controlled by the operations you allow.
- Rich inline editing for single-line & multiline text, date/time, choice, yes/no, number, currency, people picker, lookup (single & multi-value), and managed metadata.
- Any list, anywhere — the child list can live in any site collection in your tenant.
- Constraints — set minimum and maximum row counts.
- Calculated columns — display-only columns computed live per row with the formula engine (e.g.
[Quantity] * [UnitPrice]), never written back to the list. - Lookup-derived fields — a single-select lookup column (e.g. Product) can surface extra fields from the selected item (e.g. its Unit price) as auto-populated, read-only columns — usable directly in calculated columns like
[Quantity] * [UnitPrice], and updating live as the lookup changes. - Totals row — Count / Sum / Average / Min / Max in a footer, live across all rows — order totals with no code.
- Auto-updating column titles — default to the live SharePoint field name and support
[[variable:…]]tokens for multi-language. - Configurable columns, custom heading, and empty-state message (multi-language ready).
- Custom JS callback — react to row changes in code for advanced roll-ups.
-
Point it at the child list, then describe the columns
Name the site and the child list, then say which column links a row back to its parent. Lookup columns work, but so does a plain text column — and DFFS will hand you a
_DFFSIDvalue to put in it, which sidesteps SharePoint’s lookup restrictions entirely when the two lists live apart. (How to add the_DFFSIDcolumn →)Each column then gets its own row in the configuration: the display title, a width, whether it can be edited, whether it is required, an optional prefix and suffix, and whether it contributes to a totals row. Rows can also be pulled through a lookup — here SKU and Unit price come from the selected Product, so choosing a product fills them in and keeps them read-only.
-
Columns that compute themselves, per row
A calculated column runs a formula against the other columns in its own row, referenced by internal name. It is worked out live in the browser and never written back to the list, so it costs nothing to add and cannot drift out of step with the data behind it.
The editor lists the columns available to the formula, and it warns about the one trap worth knowing: a currency symbol belongs in the prefix, not inside
CONCATENATE. Concatenating turns the result into text, and a text column can no longer be summed or averaged in the totals row.
-
Empty, then filled — without ever leaving the form
Before anything is added, the section shows the headings and whatever empty-state message you wrote, plus a single Add row button. Rows are then added and edited in place: pick the product from a dropdown and its SKU and unit price arrive on their own, type a quantity and the line total follows. Each row keeps its own edit and delete controls. No second form, no dialog, no page change — and nothing is written to the child list until the parent form is saved.
The footer is the totals row from step one doing its job: Sum on the line-total column, with the
$prefix applied after the arithmetic rather than inside it. It recalculates as rows are added, edited and removed — no rule, no code.
Worked example
On an Orders form, add a Repeating Section bound to OrderLines showing Title, Quantity, Unit price, and Amount. Switch on a Sum totals row on Amount and the order total appears live in the table footer — no code. To surface that total in a parent field too, add a read-only OrderTotal field and the short callback below. Tip: make Unit price a lookup-derived column from a Product lookup so it auto-fills from the selected product.
window.dffs_repeatingSection_loaded_callback = function (id, items) {
var total = items.reduce(function (sum, row) { return sum + (row.Amount || 0); }, 0);
dffs_setFieldValue("OrderTotal", total);
};
Handle child data inline — free for 30 days.
Full functionality, no credit card.