Skip to content

feat(data): granular full-site export dialog + cmd+k Export#68

Merged
DavidBabinec merged 3 commits into
mainfrom
feat/full-site-export-modal
Jun 17, 2026
Merged

feat(data): granular full-site export dialog + cmd+k Export#68
DavidBabinec merged 3 commits into
mainfrom
feat/full-site-export-modal

Conversation

@DavidBabinec

@DavidBabinec DavidBabinec commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

What & why

Rebuilds the Export dialog into a polished sibling of the Site Import modal, makes a full export round-trip into a fresh instance identically, and makes Export reachable from cmd+k everywhere.

Screenshots

Full export — category navigator + detail (everything selected by default):

Export dialog — full export overview

Per-row checklist for a content table (All / None + live count):

Export dialog — per-row checklist

Captured against a fresh e2e instance, opened via cmd+k → "Export Site" (the new Spotlight command).

UX — granular, full-export-by-default

  • Two-column category navigator + detail pane (mirrors the Site Import "Review" step): tinted accent dots, counts, green "included" state, live server-accurate size estimate, Select all / Select none.
  • Everything selected by default → one-click full export.
  • Content tables are fully granular: opening Pages / Posts / Components / Layouts / any custom table reveals a per-row checklist (title + slug/status) with per-table All / None and a live "N of M selected" count. Untouched tables export in full and never fetch their rows.
  • Shell, media, media folders and redirects are all-or-nothing toggles; empty categories are disabled with an inline reason.

Reachable from cmd+k

  • Hoisted the dialog to a global modal (SiteExportModal) driven by adminUi.siteExport, plus an "Export Site" Spotlight command (data.export, any workspace). The Data-workspace Export button and grid "Export selected" now route through the same openSiteExport(context) store action.

Backend — close the "identical" gaps

The bundle now also carries media folders (the tree) + each asset's folderIds membership, and redirects (old URL → row, filtered self-consistent). New includeMediaFolders / includeRedirects flags, an /export/summary endpoint, extended preview totals + import counters, and replace-strategy restore (parent-first folder ordering, post-write membership assignment, redirects after their target rows).

Deliberately excluded from a portable bundle: credentials (passwords, AI keys), instance-runtime state (sessions, audit logs), plugin package bytes.

Request model

Replaces flat tables: string[] + global rowIds with a unified tables: { tableId, rowIds? }[] (omit → full export; per-entry rowIds → subset).

Verification

  • bun run build ✅ · bun run lint ✅ · bun test5446 pass, 0 fail
  • New round-trip test proves media folders, folder membership and redirects survive export → replace-import into a pristine instance; new Spotlight-command test covers the cmd+k entry; manually verified cmd+k → "Export Site" opens the dialog.

Notes

  • Pre-release: no backward-compat shims; old request shape removed.
  • docs/features/site-transfer.md updated.

🤖 Generated with Claude Code

DavidBabinec and others added 2 commits June 17, 2026 12:30
Rebuild the Data-workspace Export dialog as a sibling of the Site Import
modal: a two-column category navigator + detail pane, everything selected
by default so the primary action is a one-click full export. Content
tables expose a per-row checklist (pages/posts/components/…) with per-table
All/None; shell, media, folders and redirects are all-or-nothing toggles.

Make a full export actually round-trip into a fresh instance identically by
extending the bundle to also carry the media folder tree (+ each asset's
folder membership) and published-URL redirects. Add includeMediaFolders /
includeRedirects flags, an /export/summary endpoint for category counts,
extended preview totals + import counters, and replace-strategy restore
(parent-first folder ordering, post-write membership assignment, redirects
inserted after their target rows). Credentials and instance-runtime state
are deliberately excluded from the portable bundle.

Replace the flat tables[]+rowIds export request with a unified
tables: { tableId, rowIds? }[] model (omit → full export; per-entry rowIds
→ subset). A new round-trip test proves folders, membership and redirects
survive export → import into a pristine instance.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Hoist the Export dialog to a global modal (SiteExportModal) mounted at the
admin shell and driven by adminUi.siteExport, mirroring SiteImportModal.
Add a "Export Site" Spotlight command (data.export capability, available on
any workspace) so export is reachable from cmd+k anywhere, and route the
Data workspace's Export button + grid "Export selected" through the same
openSiteExport(context) store action instead of a page-local dialog.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
${input.name},
${input.slug},
${input.sortOrder},
${null}
Full-export overview (category navigator + detail) and the per-row content
checklist, for the PR / feature doc.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@DavidBabinec DavidBabinec marked this pull request as ready for review June 17, 2026 12:14
@DavidBabinec DavidBabinec merged commit cca3acd into main Jun 17, 2026
6 checks passed
@DavidBabinec DavidBabinec deleted the feat/full-site-export-modal branch June 30, 2026 23:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant