Exemplar page — first pass. This is a proposal for review, not established policy — see
CRUD overview. This
page reuses Create’s surface tree rather than
walking it again — see Choosing a surface, revisited — and
covers only what’s genuinely different once an object already has data in it.
The problem
Create decides where an object is born. Once it exists, editing it raises questions Create
never had to answer: the surface opens with values already in it, not a blank form; some edits
are small enough to commit the instant they’re made, and others need everything held until an
explicit Save; the surface has to know whether anything has changed at all; and the object
might not be exactly as it was when the surface opened, if someone or something else touched it
in the meantime.
None of that is a new surface decision. It’s what happens once the surface Create’s tree
already chose is holding an object that isn’t new anymore.
Choosing a surface, revisited
TITAN-CRUD-02 states the default:
the same object type uses the same surface for Create and Update, unless a stated reason
differs. Create already names the one
legitimate case where it does — this page resolves it rather than inventing a second answer.
A quick-create Modal is optimized for speed of creating something, not for that object’s
whole life. Once the object exists, it has already earned whatever permanence its type implies
— and its ongoing edit surface is the surface that permanence calls for, even if the object was
born in a lighter one.
The exception is about the object type, not the individual object. A Tag is created in
a two-second Modal and is still edited through that same lightweight surface for as long as it
exists — a Tag never earns more permanence than that, so there’s nothing to graduate to. A
saved filter is also quick-created in a Modal, but if it later becomes something people
treat as a shared, first-class asset, its edit surface moves to the fuller one — Drawer or
full page — at that point, not before. A Campaign or an integration never faces this
question at all: both are already full-page objects from the moment they’re created, so Create
and Update land on the same surface with no exception needed.
When this applies
- The object already exists and its data is being changed, not authored for the first time.
- The object was reached from Create’s
“duplicated from an existing one” case — the surface is Create’s tree; the values arriving
pre-filled from a template is this page’s concern.
When it doesn’t
Structure
Behavior
Constraints
Content
Accessibility
- Opening the edit surface moves focus to its first field once values have loaded, matching
Create’s own behavior for a Modal
or Drawer. Moving focus before values arrive would land the reader in a field about to change
under them.
- A failed save’s inline error is announced per
Inline editing’s rule for a
single field, or Form validation’s rule for
a whole-surface save.
- The concurrent-edit re-confirmation states the specific change in its accessible description,
not through color alone — the same requirement
Destructive confirmation
already states for its own body text.
Variations
Anti-patterns
Editing a Tag on a full page because “editing deserves more room than creating.” The Tag’s
permanence hasn’t changed just because it now exists — see TITAN-UPDATE-02.
Reopening the whole edit surface for a one-field change that Inline editing already covers.
Adds a navigation and a full form for a change that takes one field and one second.
Committing a multi-field edit field-by-field as each one changes, with no single Save.
Leaves the object in a partially-applied combination of values nobody chose as a set.
Silently discarding a save because the object changed on the server, with no way to see what
changed. The reader loses their edit with no explanation — the same failure
TITAN-DESTROY-09 already
names for a dialog that closes on failure.
CRUD overview, for the shared axes and
TITAN-CRUD-02, which this page
resolves. Create, whose surface this page reuses
and whose Variations table first raised the pointer this page answers.
Read, the sibling CRUD operation.
Inline editing, for a single field’s whole
behavior. Loading & skeletons, for the
prefill-loading treatment. Destructive confirmation
and Form validation, cited above rather than
restated.