Noura Homes - Specbook
GuidesSpec sheets

Undo and redo

Revert your last edits with Cmd/Ctrl-Z while filling out a spec sheet.

Spec sheets autosave as you go. Every blur, dropdown pick, and drag-reorder is committed the moment it happens. Undo and redo give you a keyboard escape hatch when you fat-finger something.

Quick reference

ActionMacWindows / Linux
Undo last edit⌘ZCtrl+Z
Redo last edit⌘⇧ZCtrl+Shift+Z or Ctrl+Y

The same actions are available as the Undo and Redo icon buttons in the sheet header. They disable themselves when there's nothing to undo or redo.

Undo and Redo buttons in the sheet header
Undo and Redo sit in the sheet header next to Columns. Hover for the keyboard shortcut.

What's reversible

Anything you do while filling out a sheet:

  • Cell edits, text, number, date, checkbox, dropdown, autocomplete (Brand / Model / Colour / …).
  • Add row and delete row.
  • Drag-reorder rows within a section, and drag-reorder sections within a sheet.
  • Rename a section label, undone in one step even though it touches every row in the section.

What's not on the stack

  • Customize Columns changes (adding, removing, or hiding custom fields). Roll those back from Columns settings.
  • Convert scope between per-project and per-unit. Flip back via Convert scope.
  • Copy-from-unit and cross-project copy operations.
  • Mark complete and Reopen sheet. Use the explicit Reopen button.
  • Comments and attachments, manage those from the right rail.

These either have their own affordance, or they have a big enough blast radius (touching every row, rewriting the audit trail) that it didn't feel right to bury them under a keyboard shortcut.

Inside text fields

When the caret is in a text field, ⌘Z reverts the characters you just typed. That's the browser's own undo, same as anywhere else on the web. App-level undo, the kind that reverts your last saved edit, only kicks in when focus is somewhere else, on the body, a button, or the sheet grid.

Same model Notion and Google Sheets use, so your typing-undo and your edit-undo don't fight each other. A typical flow:

  1. You're typing into the Notes field. You hit ⌘Z, and the last few characters disappear (browser undo, the cell hasn't saved yet).
  2. You Tab out of the field. The cell autosaves.
  3. You hit ⌘Z again, and the cell reverts to its prior saved value (app undo).

On a locked sheet

When a sheet is complete, or its project is finalised or archived, every edit needs a change reason, and undo is no exception. Cmd-Z on a locked sheet opens the same change-reason dialog you'd see for a fresh edit:

  • Type a reason, click Save with reason, and the row reverts. The audit-log entry records what changed, why, and that it came from an undo.
  • Click Cancel and the undo is aborted. The stack stays untouched and the sheet doesn't change.

The audit trail still shows who changed what, when, and why, even when the change was a revert.

In the activity log

Every undo and every redo shows up in the activity log as its own entry, tagged with a small ↩ Undo or ↪ Redo icon. The verb is reverted or re-applied instead of edited, and the diff still shows what flipped (e.g. Antique Bronze → Matte Black).

That way the log always matches what's actually in the cell. If you see a recent revert, you know it came from a Cmd-Z and not a fresh edit.

Stack lifetime

The undo stack is in-session, per-sheet, and personal:

  • In-session, closing the tab, reloading, or navigating to a different category clears the stack.
  • Per-sheet, each spec sheet (each category-on-a-unit, or category-on-a-project) keeps its own stack.
  • Personal, only your own edits land on your stack. Edits your teammates make aren't reversible from your keyboard.

The stack holds up to 50 edits in each direction. If you go past that on a heavy editing day, the oldest entry drops off without a fuss.

For anything older, or anything from a previous session, the activity log on each item and on the project dashboard is the durable record. And you can always re-edit a row directly to whatever value you want.

When undo can't proceed

If the row you're trying to revert was changed somewhere else after you made the edit (a different tab, a teammate), undo will:

  1. Try the inverse mutation.
  2. If the server says the row was changed elsewhere or no longer exists, show "Couldn't undo: row was changed elsewhere".
  3. Drop that entry from the stack so the next ⌘Z moves on to the next reversible action.

Refresh the sheet to see the latest values, then make your fix manually.

On this page