Edit Contact
What Was Built
Edit Contact lets staff correct an existing person through the contact editor on a dedicated console route. It reads the contact, compiles the built-in edit form against field metadata, keeps draft values, reviews changes and submits the changed bound fields against the original version. The affiliations components come from the recorded v0 revision-3 work. The inspected evidence does not establish that every other part of the editor was authored by hand or when it was built.
Routing
The Next.js edit page receives id and renders ContactEditor inside RequirePermission. The route registry names crm.contacts.record.edit with contactId, and the legacy /contacts/:id/edit mapping redirects to the registered route. The entry check uses permissions.crm.contacts.edit, mapped to crm.contacts.update. Registry labels establish the Edit segment; this inspection does not prove that the shell resolves a live contact name in every breadcrumb or separately verify its layout gates.
Source
ContactEditor coordinates loading, form-definition compilation, draft state, review and submission. Its header, change-summary, save-failure, mapping and collection files divide that work. FormRenderer renders the compiled form, and contact collection and affiliation adapters bind its values to the reusable editors. EditorActionBar supplies the sticky controls, issue list and conflict alert. Record operations choose live CRM or the mock store, with live mapping and update reconciliation in the contact libraries.
Components
The registered Address Editor implementation serves the address collection. Other built collaborators include the affiliation row and drawer, email and phone editors, record selectors, form renderer and editor action bar. Their presence in code does not imply registered component contracts. FND-CRM-ENT-085 records the affiliation registration gap; the screen's protected component list remains the record of its current registration state.
Data Integration
Record operations load the contact through live CRM or the console's mock store. Platform metadata supplies the object description. Edit disables create-form resolution, so useCreateForm returns the built-in contact-admin definition rather than a configured type-specific form. The loaded record becomes normalized draft and initial form values; the form's supported bindings determine which changed keys enter the write body. Affiliation mapping prepares the relationship write, and live mapping produces version-tested patch directives.
Eligible uncertain write results are reconciled by reading back and comparing sent values. Success discards the held draft and navigates away; it does not replace form state and keep this editor open. A conflict leaves the draft available. Reload discards it and reloads the record with a notice. The draft hooks restore sign-in recovery values against their original base version, preserving stale-write detection.
Actions as Implemented
Save validates first, then opens Review Changes and submits on confirmation. A validation issue can leave Save clickable, because the attempt reveals and focuses the issue rather than submitting. Reload performs a fresh read; Keep Editing clears the conflict alert without changing the draft. Cancel and ordinary same-origin links use the discard guard, whose source has no browser Back handler.
Affiliation, role and contact-point actions edit the draft until contact submission. Source-controlled address rows can be removed directly on the current row-controls path. Preference controls toggle existing rows and edit subscription choices. Photo selection reaches the draft, but live mapping warns that photo upload is unavailable and continues with supported changes. These observations do not justify the draft's earlier claim that every listed action matches its design exactly.
Authorization
The page's edit permission maps to the CRM update key. The service declares read authorization for getContact and update authorization for patchContact, with unlock permission evaluation on the write. The patch handler maps directives with conflict details and passes the expected version to updateContact. Its declarations establish the service boundary; they do not establish universal field-level permission filtering in the browser. Record restrictions remain service responsibilities.
Observability
The editor communicates failures through error toasts, mapped field issues and an action-bar conflict alert. The inspected component contains no dedicated logging, metric emission or error-service call. The service patch handler nudges the change-event dispatcher after updating the record. This source review does not establish wider application telemetry or claim that the screen is the sole source of save observability.
Design Fidelity
FND-CRM-ENT-088 records open differences in validation, navigation, linked removal and conflict presentation. Save remains enabled for a dirty invalid draft and validates on attempt; current source-controlled address rows have an enabled Remove action; the navigation guard does not intercept browser Back. Conflict choices live in an inline action-bar alert rather than the inventory's conflict dialog. The editor uses the built-in edit definition rather than resolving configured contact-type forms as the earlier design prose claims. The fidelity row preserves these differences without changing the protected design criteria.
The affiliation screenshot notes document Andrew's direct-role-checkbox and separate-tab changes. They establish historical choices for the affiliations work. The current drawer uses dated role rows with selectors and Add Role instead of that historical checkbox layout. These notes do not approve the whole Screen Design or settle the open fidelity differences.
Verification
The screen specification defines eight proposed browser scenarios. Contact acceptance journeys contain related assertions, but their partial contributions do not establish the full three screen scenarios previously bound to the suite; FND-CRM-ENT-090 records that distinction. The protected verification lists retain the existing browser, fixture and service suites without certifying their results.
Contact editor unit tests exist but lack a registered executable-suite home, as FND-CRM-ENT-086 records. This job inspects source and runs corpus checks; it does not execute the deployed console journeys, conduct an accessibility audit or verify deployment of the pinned console commit.
Screenshots
The artifact retains one desktop image of the Affiliations tab. The affiliations notes describe this mock-mode editor capture and its revision-3 components. Its committed path, capture date and hash remain unchanged. This review checks the recorded source and image identity; it does not produce a new screenshot or infer a live deployment from the mock capture.