---
id: CMP-CRM-ENT-002
title: Affiliation Row
product_area: crm
module: entities
revision: 1
status: draft
design_intent: proposed
implementation_evidence: observed
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
purpose: Presents one resolved organizational relationship with its dates, roles, information sources and caller-authorized
  actions.
reuse: Used by the contact affiliation section in Create Contact, Edit Contact and Contact 360; compact density
  and a replacement title support other resolved relationship lists without fetching records.
supports:
- CAP-CRM-ENT-009
- CAP-CRM-ENT-011
realises:
- CON-CRM-ENT-003
- CON-CRM-ENT-005
props:
- name: row
  type: resolved affiliation presentation
  required: true
  default: none
  meaning: Contains identity, organization name and optional destination, archived flag, type label, job title,
    dated role labels, formatted dates, current/past/future status, primary flag and link summaries.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- name: onEdit
  type: event handler
  required: false
  default: none
  meaning: Opens the caller’s editor; omission makes the row lack an Edit action.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- name: onMakePrimary
  type: event handler
  required: false
  default: none
  meaning: Offers Make Primary whenever supplied; the caller decides eligibility.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- name: onRemove
  type: event handler
  required: false
  default: none
  meaning: Offers destructive draft removal whenever supplied.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- name: issue
  type: text
  required: false
  default: none
  meaning: Shows the caller’s validation issue as an alert.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- name: density
  type: default or compact
  required: false
  default: default
  meaning: Adjusts padding and decorative icon size.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- name: title
  type: rendered content
  required: false
  default: none
  meaning: Replaces the organization name line, without replacing organization-based action names.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- name: className
  type: presentation classes
  required: false
  default: none
  meaning: Extends row presentation.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
events:
- name: edit
  when: Edit is activated.
  payload: No payload; the callback already identifies the row.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- name: make primary
  when: Make Primary is activated.
  payload: No payload.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- name: remove
  when: Remove is activated.
  payload: No payload.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
states:
- state: current
  experience: A solid card carries the Current word and icon.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- state: past
  experience: A dashed muted card carries Past and the supplied ending date.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- state: future
  experience: The card says Starts with the supplied date or Upcoming when absent.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- state: primary or archived
  experience: Text badges identify Primary and Archived independently.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- state: invalid
  experience: The supplied issue appears as an alert beneath role and source summaries.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- state: read only
  experience: Omitting all action callbacks removes the action controls.
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
validation: []
accessibility: Edit and More actions have organization-specific accessible names. Roles form a named list; issue
  text has alert semantics; status uses words and icons, and decorative icons are hidden. Navigation has a visible
  focus style. Complete keyboard and assistive-technology behavior remains unverified.
design_system:
- badge
- button
- dropdown menu
- tooltip
- navigation link
depends_on: []
implementation: CMI-CRM-ENT-002
acceptance:
- id: AC-CMP-CRM-ENT-002-01
  proved_by: []
  statement: A past row displays Past and its supplied ending date with a dashed presentation.
  level: unit
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- id: AC-CMP-CRM-ENT-002-02
  proved_by: []
  statement: Omitting the edit, primary and removal callbacks leaves no action controls.
  level: unit
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- id: AC-CMP-CRM-ENT-002-03
  proved_by: []
  statement: Supplying an issue displays its exact text with alert semantics.
  level: unit
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
controls: []
evidence:
- react-console:components/affiliations/affiliation-row.tsx
narrative_sources:
- section: What It Is For
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- section: Where It Is Used
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- section: How It Behaves
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- section: Its Contract
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- section: States
  provenance: observed
  source: react-console:components/affiliations/affiliation-row.tsx
- section: Accessibility
  provenance: unknown
  source: FND-CRM-ENT-161
- section: Open Design Questions
  provenance: unknown
  source: FND-CRM-ENT-161; FND-CRM-ENT-162; FND-CRM-ENT-163
used_by: [CMP-CRM-ENT-003]
---

# Affiliation Row

## What It Is For

Presents one resolved organizational relationship with its dates, roles, information sources and caller-authorized actions. A presentation component and five exported display helpers render one resolved affiliation. The row has no service reads, local draft or record mutation; it delegates every action to its consumer.

## Where It Is Used

Used by the contact affiliation section in Create Contact, Edit Contact and Contact 360; compact density and a replacement title support other resolved relationship lists without fetching records. Create Contact and Edit Contact use the row through the reusable affiliation section and form adapter. Contact 360 uses that section through its affiliations card.

## How It Behaves

The row receives presentation-ready facts rather than deciding dates or looking up configuration. It shows the organization name as a link only when a destination is supplied. A title override replaces that line. Type and optional primary and archived badges sit above title, date and status details. Roles retain their supplied order and optional date strings; nonempty source strings become a compact summary. The row renders Edit, Make Primary and Remove according to the callbacks present, without applying a permission or date guard itself.

## Its Contract

The consumer resolves names, formats dates and classifies the relationship before rendering. It supplies callbacks only for actions it can perform. The row emits no replacement affiliation and performs no persistence request. Compact density changes spacing rather than the data contract. A custom title can name a person, but action names still refer to the supplied organization; consumers must account for that distinction.

## States

Current: A solid card carries the Current word and icon. Past: A dashed muted card carries Past and the supplied ending date. Future: The card says Starts with the supplied date or Upcoming when absent. Primary or archived: Text badges identify Primary and Archived independently. Invalid: The supplied issue appears as an alert beneath role and source summaries. Read only: Omitting all action callbacks removes the action controls.

## Accessibility

Edit and More actions have organization-specific accessible names. Roles form a named list; issue text has alert semantics; status uses words and icons, and decorative icons are hidden. Navigation has a visible focus style. Complete keyboard and assistive-technology behavior remains unverified. 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.
