Skip to content

Using Tree View

Parent Tree View keeps the familiar Table Surface columns and actions while loading one sibling page at a time. It is available in Data Explorer, direct tables, Details/Drawer related-data tables, and a full Reference Lookup picker whenever the effective Table Surface is Tree.

You can expand and collapse rows, retry a failed branch, load additional children under one parent, sort siblings, search/filter while retaining branch context, select real loaded rows in supported desktop or picker hosts, and use the responsive layout. When the effective sort is Manual Order, authorized users can drag with a pointer or use the accessible Move… action on keyboard/mobile. The narrow/mobile Data Explorer intentionally has no record selection or bulk-action bar. There is no expand-all, subtree selection, or WYSIWYG tree export.

A chevron means that the record has eligible direct children. Expanding it loads page 1 for that parent. Load more appears inside the branch when more siblings exist. Collapsing retains the loaded page so immediate re-expansion does not require another request.

Loading and retry controls belong to the branch being fetched. A failure does not remove the parent or other open branches. If the Table Surface changed while the request was in flight, the UI discards the entire tree and reloads the bootstrap instead of merging stale children.

Data Explorer, direct tables, and full pickers use their normal footer to page root branches only. An embedded Details/Drawer related table instead shows a root-level Load more control that appends the next root page. Every expanded parent has its own, separate child page and Load more sequence. Therefore:

  • root TotalCount is the number of eligible roots, not every descendant;
  • changing the root page in a footer host replaces the visible forest;
  • root-level More in an embedded related table appends roots without duplicates;
  • loading another child page does not move or append roots;
  • maximum page size is 250.

Sorting is server-side and applies independently to every sibling set. Direct table and picker hosts send the same ordered sort for roots and later child requests. Related Details/Drawer hosts send their opaque context revision; the server re-resolves the hosted Table Surface and restores its configured sort for every root and child page. Supported sorts reuse Entity Instance Query semantics: DisplayName, ordinary fields, Reference target DisplayName, ascending/descending direction, null handling, multi-column order, and a stable record-id tie-breaker.

Changing sort reloads roots and closes branches. Sorting only the rows currently projected into AG Grid would mix levels and produce a false hierarchy, so Tree View never uses AG Grid client sorting.

Manual Order is a typed sibling-sort option. It uses the Entity Definition’s single global ranks for roots and every sibling set. Selecting an ordinary sort immediately disables movement without changing ranks. An explicit Tree sort wins over the entity default; with neither one, Display name ascending remains the fallback. See Manual Order.

Only direct matches count as query results. A visible parent that does not match may still appear with an ancestor-context marker when one of its visible descendants matches. Follow that branch until the direct match appears.

Hidden records never become context. If a readable child has no visible, readable parent in the current archive scope, it becomes an effective root.

  • Expanding a row does not select it.
  • Selecting a parent does not select children.
  • Load more is not a record and cannot be selected or acted on.
  • The desktop Data Explorer removes selected descendants when collapse hides them, so a bulk action cannot target invisible stale rows. The narrow/mobile Data Explorer has no row selection or group actions. Entering it clears the desktop selection and pending group-action UI; returning to desktop starts unselected.
  • A Reference picker retains explicit selections across collapse, paging, and refinement until you clear, cancel, or confirm them. It never infers unloaded descendants.

All ordinary row actions retain their existing permission checks. Changing the configured parent through an edit refreshes the tree rather than moving a row optimistically.

Manual Order movement composes the same row permission, hierarchy, Reference, Reference Eligibility, invariant, and mutation-effect rules as an ordinary governed update. A rejected move leaves the row at its authoritative position. Successful reparenting commits Parent and relative order together and refreshes matching open hosts without a page loader.

Data Explorer export is a desktop-only workflow. On desktop, Current query export sends the current filter, sort, and archive scope; it exports direct matches and excludes records shown only as ancestor context. Selected rows export sends exactly the selected record ids. The narrow/mobile card layout offers neither query export nor selected-row export. V1 does not export the current depth-first screen projection.

A Tree Table Surface can be used only by the full Lookup picker. List and LongList inputs cannot represent lazy branches and are rejected during configuration. In the picker, use the chevron to navigate and the separate Select action to choose a record.

Tree controls are native buttons: Tab moves focus; Enter or Space activates expand, collapse, retry, and load-more controls. Expandable rows expose aria-expanded; every tree row exposes its real one-based aria-level. Visual indentation stops growing after eight levels, but the accessible level remains exact.

The Move… action is the supported keyboard/mobile movement path; keyboard drag gestures are not used. Target-bearing moves use the same-record-type selector. A stale target keeps the dialog open, refreshes its safe label and version, and requires explicit resubmission rather than moving automatically.

At narrow widths, Data Explorer uses record cards with the same hierarchy, row-level actions, branch loading, root pagination, markers, and errors. To keep those cards compact, it deliberately omits record checkboxes, multi-record selection, and the bulk-action bar. The full picker keeps the same tree semantics and uses compact row actions; picker selection remains available when the picker workflow requires it.

Search an Epic/request tree for address. The root Customer onboarding and child Create account may appear as context; Verify address is the direct match. Sorting by Subject orders root Epics among roots and Requests among their own siblings. Exporting the query includes Verify address, not the two context-only ancestors.

StateMeaningRecovery
Branch retryOne child request failedRetry that branch.
Tree response invalidPayload had both/neither Page and TreePage, or conflicts with the surfaceReload; report persistent contract errors.
Surface changed (409)A surface, persisted Lookup, or related host-context revision is staleThe UI clears tree state and bootstraps again.
Search unavailable (400, moltaro.search.notAvailable)The Entity Definition has no available configured-search targetPreserve or clear the query, fix search configuration if appropriate, and retry; do not flatten the Tree response.
Hierarchy warningA self-parent or cycle edge was cut safelyInspect and repair that record’s Parent value.