Affiliation Section
What It Is For
Groups a contact’s organizational relationships so staff can distinguish current, upcoming and past ties and manage the draft. The reusable section renders contact-owned relationship groups and delegates presentation to Affiliation Row. Date-group helpers determine which filters are useful and preserve supplied order. It is separate from the organization-side people-list section.
Where It Is Used
Serves Create Contact, Edit Contact and Contact 360. The organization Contacts tab uses a separate API-backed section of the same exported name and is outside this component’s contract. The form-engine affiliation adapter renders this section in Create Contact and Edit Contact. The Contact 360 affiliations card supplies read-only rows and an optional Manage destination. Organization 360 uses its own paged people-list implementation.
How It Behaves
Counts describe all supplied rows, while the selected filter controls the visible groups. Filters appear only when multiple date classes occur, and include only classes present. If changed data makes the selected class unavailable, the effective filter becomes All. Current, upcoming and past rows remain separate. Add is available only in editable mode with a callback; read-only mode can instead offer Manage. The component preserves caller ordering inside each class rather than sorting the records itself.
Its Contract
The caller supplies resolved rows, optional issues and notices, and all mutation callbacks. Filter choice is the section’s only local application state. Row callbacks receive identifiers so the form can find its own draft entries. The section offers Make Primary for any nonpast, nonprimary row with no end date when the callback exists; this includes future rows. The upstream draft validation and service remain responsible for rejecting an ineligible primary request.
States
Empty: A dashed invitation says there are no organization affiliations, with Add or Manage when available. Mixed dates: Counts and filters distinguish current, upcoming and past groups. One date class: No redundant filter group appears. Read only: Rows have no mutation callbacks; an optional Manage link remains. Notice or issue: The overall notice is a status message and individual issues are alerts.
Accessibility
The toggle group is named Filter Affiliations, row collections use list elements, and the no-primary notice has status semantics. Row action naming comes from Affiliation Row. A complete keyboard and screen-reader audit is absent. Accessibility verification is an open obligation recorded in the component accessibility finding.
Open Design Questions
The recorded interaction is observed implementation, with proposed design intent. Component criteria need complete executable bindings and browser accessibility review. Screen owners must wire the registered components into their designs; this slice records usage without changing those screen contracts.