@trieb.work/payload-plugin-backup-mongodb 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/README.md +319 -0
  2. package/dist/backup-dashboard.css +1132 -0
  3. package/dist/client.d.ts +3 -0
  4. package/dist/client.js +3 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/collections/BackupSettings.d.ts +6 -0
  7. package/dist/collections/BackupSettings.js +91 -0
  8. package/dist/collections/BackupSettings.js.map +1 -0
  9. package/dist/collections/BackupTasks.d.ts +2 -0
  10. package/dist/collections/BackupTasks.js +56 -0
  11. package/dist/collections/BackupTasks.js.map +1 -0
  12. package/dist/components/BackupDashboard/BackupItemActions.client.d.ts +7 -0
  13. package/dist/components/BackupDashboard/BackupItemActions.client.js +90 -0
  14. package/dist/components/BackupDashboard/BackupItemActions.client.js.map +1 -0
  15. package/dist/components/BackupDashboard/BackupListCollapsible.client.d.ts +16 -0
  16. package/dist/components/BackupDashboard/BackupListCollapsible.client.js +597 -0
  17. package/dist/components/BackupDashboard/BackupListCollapsible.client.js.map +1 -0
  18. package/dist/components/BackupDashboard/BackupSettingsModal.client.d.ts +2 -0
  19. package/dist/components/BackupDashboard/BackupSettingsModal.client.js +939 -0
  20. package/dist/components/BackupDashboard/BackupSettingsModal.client.js.map +1 -0
  21. package/dist/components/BackupDashboard/CollectionBackupPreviewBody.client.d.ts +18 -0
  22. package/dist/components/BackupDashboard/CollectionBackupPreviewBody.client.js +267 -0
  23. package/dist/components/BackupDashboard/CollectionBackupPreviewBody.client.js.map +1 -0
  24. package/dist/components/BackupDashboard/ManualBackupDialog.client.d.ts +1 -0
  25. package/dist/components/BackupDashboard/ManualBackupDialog.client.js +276 -0
  26. package/dist/components/BackupDashboard/ManualBackupDialog.client.js.map +1 -0
  27. package/dist/components/BackupDashboard/RestoreBackupDialog.client.d.ts +6 -0
  28. package/dist/components/BackupDashboard/RestoreBackupDialog.client.js +551 -0
  29. package/dist/components/BackupDashboard/RestoreBackupDialog.client.js.map +1 -0
  30. package/dist/components/BackupDashboard/TaskActionButton.client.d.ts +29 -0
  31. package/dist/components/BackupDashboard/TaskActionButton.client.js +240 -0
  32. package/dist/components/BackupDashboard/TaskActionButton.client.js.map +1 -0
  33. package/dist/components/BackupDashboard/backupDashboardInlineCss.d.ts +1 -0
  34. package/dist/components/BackupDashboard/backupDashboardInlineCss.js +3 -0
  35. package/dist/components/BackupDashboard/backupDashboardInlineCss.js.map +1 -0
  36. package/dist/components/BackupDashboard/index.client.d.ts +8 -0
  37. package/dist/components/BackupDashboard/index.client.js +9 -0
  38. package/dist/components/BackupDashboard/index.client.js.map +1 -0
  39. package/dist/components/BackupDashboard/index.d.ts +8 -0
  40. package/dist/components/BackupDashboard/index.js +196 -0
  41. package/dist/components/BackupDashboard/index.js.map +1 -0
  42. package/dist/core/archive.d.ts +8 -0
  43. package/dist/core/archive.js +47 -0
  44. package/dist/core/archive.js.map +1 -0
  45. package/dist/core/backup.d.ts +41 -0
  46. package/dist/core/backup.js +188 -0
  47. package/dist/core/backup.js.map +1 -0
  48. package/dist/core/backupBlobIO.d.ts +54 -0
  49. package/dist/core/backupBlobIO.js +179 -0
  50. package/dist/core/backupBlobIO.js.map +1 -0
  51. package/dist/core/backupBlobTransfer.d.ts +29 -0
  52. package/dist/core/backupBlobTransfer.js +85 -0
  53. package/dist/core/backupBlobTransfer.js.map +1 -0
  54. package/dist/core/backupSettings.d.ts +35 -0
  55. package/dist/core/backupSettings.js +95 -0
  56. package/dist/core/backupSettings.js.map +1 -0
  57. package/dist/core/backupSourcePreview.d.ts +10 -0
  58. package/dist/core/backupSourcePreview.js +33 -0
  59. package/dist/core/backupSourcePreview.js.map +1 -0
  60. package/dist/core/blobTokenValidate.d.ts +14 -0
  61. package/dist/core/blobTokenValidate.js +75 -0
  62. package/dist/core/blobTokenValidate.js.map +1 -0
  63. package/dist/core/db.d.ts +24 -0
  64. package/dist/core/db.js +12 -0
  65. package/dist/core/db.js.map +1 -0
  66. package/dist/core/restore.d.ts +27 -0
  67. package/dist/core/restore.js +199 -0
  68. package/dist/core/restore.js.map +1 -0
  69. package/dist/core/restorePreview.d.ts +64 -0
  70. package/dist/core/restorePreview.js +266 -0
  71. package/dist/core/restorePreview.js.map +1 -0
  72. package/dist/core/taskProgress.d.ts +26 -0
  73. package/dist/core/taskProgress.js +73 -0
  74. package/dist/core/taskProgress.js.map +1 -0
  75. package/dist/core/vercelBackupCron.d.ts +8 -0
  76. package/dist/core/vercelBackupCron.js +38 -0
  77. package/dist/core/vercelBackupCron.js.map +1 -0
  78. package/dist/endpoints/createBackupEndpoints.d.ts +1 -0
  79. package/dist/endpoints/createBackupEndpoints.js +3 -0
  80. package/dist/endpoints/createBackupEndpoints.js.map +1 -0
  81. package/dist/endpoints/index.d.ts +3 -0
  82. package/dist/endpoints/index.js +34 -0
  83. package/dist/endpoints/index.js.map +1 -0
  84. package/dist/endpoints/paths/admin-backup-download.d.ts +8 -0
  85. package/dist/endpoints/paths/admin-backup-download.js +72 -0
  86. package/dist/endpoints/paths/admin-backup-download.js.map +1 -0
  87. package/dist/endpoints/paths/admin-delete.d.ts +3 -0
  88. package/dist/endpoints/paths/admin-delete.js +55 -0
  89. package/dist/endpoints/paths/admin-delete.js.map +1 -0
  90. package/dist/endpoints/paths/admin-manual.d.ts +3 -0
  91. package/dist/endpoints/paths/admin-manual.js +61 -0
  92. package/dist/endpoints/paths/admin-manual.js.map +1 -0
  93. package/dist/endpoints/paths/admin-preview.d.ts +6 -0
  94. package/dist/endpoints/paths/admin-preview.js +102 -0
  95. package/dist/endpoints/paths/admin-preview.js.map +1 -0
  96. package/dist/endpoints/paths/admin-restore.d.ts +3 -0
  97. package/dist/endpoints/paths/admin-restore.js +74 -0
  98. package/dist/endpoints/paths/admin-restore.js.map +1 -0
  99. package/dist/endpoints/paths/admin-seed.d.ts +3 -0
  100. package/dist/endpoints/paths/admin-seed.js +47 -0
  101. package/dist/endpoints/paths/admin-seed.js.map +1 -0
  102. package/dist/endpoints/paths/admin-settings.d.ts +3 -0
  103. package/dist/endpoints/paths/admin-settings.js +230 -0
  104. package/dist/endpoints/paths/admin-settings.js.map +1 -0
  105. package/dist/endpoints/paths/admin-task.d.ts +3 -0
  106. package/dist/endpoints/paths/admin-task.js +34 -0
  107. package/dist/endpoints/paths/admin-task.js.map +1 -0
  108. package/dist/endpoints/paths/admin-validate-blob-token.d.ts +8 -0
  109. package/dist/endpoints/paths/admin-validate-blob-token.js +26 -0
  110. package/dist/endpoints/paths/admin-validate-blob-token.js.map +1 -0
  111. package/dist/endpoints/paths/cron-list.d.ts +2 -0
  112. package/dist/endpoints/paths/cron-list.js +33 -0
  113. package/dist/endpoints/paths/cron-list.js.map +1 -0
  114. package/dist/endpoints/paths/cron-restore.d.ts +2 -0
  115. package/dist/endpoints/paths/cron-restore.js +61 -0
  116. package/dist/endpoints/paths/cron-restore.js.map +1 -0
  117. package/dist/endpoints/paths/cron-run.d.ts +3 -0
  118. package/dist/endpoints/paths/cron-run.js +45 -0
  119. package/dist/endpoints/paths/cron-run.js.map +1 -0
  120. package/dist/endpoints/shared.d.ts +13 -0
  121. package/dist/endpoints/shared.js +58 -0
  122. package/dist/endpoints/shared.js.map +1 -0
  123. package/dist/exports/client.d.ts +1 -0
  124. package/dist/exports/client.js +3 -0
  125. package/dist/exports/client.js.map +1 -0
  126. package/dist/exports/rsc.d.ts +1 -0
  127. package/dist/exports/rsc.js +3 -0
  128. package/dist/exports/rsc.js.map +1 -0
  129. package/dist/index.d.ts +18 -0
  130. package/dist/index.js +14 -0
  131. package/dist/index.js.map +1 -0
  132. package/dist/plugin.d.ts +3 -0
  133. package/dist/plugin.js +82 -0
  134. package/dist/plugin.js.map +1 -0
  135. package/dist/publicApiPaths.d.ts +19 -0
  136. package/dist/publicApiPaths.js +20 -0
  137. package/dist/publicApiPaths.js.map +1 -0
  138. package/dist/types.d.ts +21 -0
  139. package/dist/types.js +3 -0
  140. package/dist/types.js.map +1 -0
  141. package/dist/utils/backupSelection.d.ts +6 -0
  142. package/dist/utils/backupSelection.js +16 -0
  143. package/dist/utils/backupSelection.js.map +1 -0
  144. package/dist/utils/blobName.d.ts +32 -0
  145. package/dist/utils/blobName.js +99 -0
  146. package/dist/utils/blobName.js.map +1 -0
  147. package/dist/utils/dashboardRoleAccess.d.ts +23 -0
  148. package/dist/utils/dashboardRoleAccess.js +64 -0
  149. package/dist/utils/dashboardRoleAccess.js.map +1 -0
  150. package/dist/utils/dialogBackdrop.d.ts +9 -0
  151. package/dist/utils/dialogBackdrop.js +17 -0
  152. package/dist/utils/dialogBackdrop.js.map +1 -0
  153. package/dist/utils/formatBytes.d.ts +2 -0
  154. package/dist/utils/formatBytes.js +20 -0
  155. package/dist/utils/formatBytes.js.map +1 -0
  156. package/dist/utils/hostname.d.ts +2 -0
  157. package/dist/utils/hostname.js +17 -0
  158. package/dist/utils/hostname.js.map +1 -0
  159. package/dist/utils/index.d.ts +5 -0
  160. package/dist/utils/index.js +7 -0
  161. package/dist/utils/index.js.map +1 -0
  162. package/dist/utils/maskBlobToken.d.ts +11 -0
  163. package/dist/utils/maskBlobToken.js +42 -0
  164. package/dist/utils/maskBlobToken.js.map +1 -0
  165. package/package.json +140 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/BackupDashboard/BackupSettingsModal.client.tsx"],"sourcesContent":["'use client'\n\nimport type { FC } from 'react'\n\nimport { Button } from '@payloadcms/ui'\nimport { useRouter } from 'next/navigation'\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react'\n\nimport type { BackupSourcePreviewResponse } from '../../core/backupSourcePreview'\nimport type { BackupTaskProgress } from '../../core/taskProgress'\n\nimport { backupPluginPublicApiPaths } from '../../publicApiPaths'\nimport { selectedFromSkipMongoNames, skipMongoNamesFromPreview } from '../../utils/backupSelection'\nimport { closeNativeDialogOnBackdropPointer } from '../../utils/dialogBackdrop'\nimport { CollectionBackupPreviewBody } from './CollectionBackupPreviewBody.client'\n\nfunction parseBlobTransferTaskMessage(msg: string): {\n failed: number\n pathname?: string\n total: number\n transferred: number\n} | null {\n try {\n const o = JSON.parse(msg) as Record<string, unknown>\n if (typeof o.total !== 'number' || typeof o.transferred !== 'number') {\n return null\n }\n return {\n failed: typeof o.failed === 'number' ? o.failed : 0,\n pathname: typeof o.pathname === 'string' ? o.pathname : undefined,\n total: o.total,\n transferred: o.transferred,\n }\n } catch {\n return null\n }\n}\n\nconst TIP_SETTINGS_SUBTITLE =\n 'These settings apply to scheduled (cron) backups only. Manual backups use the choices in the manual backup dialog each time you create one.'\n\nconst TIP_TRANSFER_COPY =\n 'When enabled, objects under backups/ are copied from the previous backup token (or from BLOB_READ_WRITE_TOKEN on first setup) into the new store. When disabled, only the new token is saved — existing backups stay in the old storage and remain reachable with the previous token.'\n\nconst TIP_TRANSFER_DELETE =\n 'Destructive: when enabled, each blob is removed from the old store only after a successful copy to the new store. Leave disabled to keep a full copy in the previous storage as a safety net.'\n\ninterface SettingsHelpTipProps {\n multiline?: boolean\n tip: string\n}\n\nfunction settingsHelpIconClassName(multiline?: boolean): string {\n return [\n 'backup-help-icon',\n 'backup-help-icon--settings-tooltip',\n multiline ? 'backup-help-icon--multiline' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\n/** Info icon + CSS tooltip; fixed positioning so scroll/clipping in the dialog body does not hide it. */\nconst SettingsHelpTip: FC<SettingsHelpTipProps> = ({ multiline, tip }) => {\n const elRef = useRef<HTMLButtonElement>(null)\n\n const syncTooltipAnchor = useCallback(() => {\n const el = elRef.current\n if (!el) {\n return\n }\n const r = el.getBoundingClientRect()\n el.style.setProperty('--backup-tip-x', `${r.left + r.width / 2}px`)\n el.style.setProperty('--backup-tip-y', `${r.top}px`)\n }, [])\n\n return (\n <button\n aria-label={tip}\n className={settingsHelpIconClassName(multiline)}\n data-tip={tip}\n onFocus={syncTooltipAnchor}\n onMouseEnter={syncTooltipAnchor}\n ref={elRef}\n title={tip}\n type=\"button\"\n >\n i\n </button>\n )\n}\n\ninterface BackupSettingsApiResponse {\n /** Persisted access level after the last successful token validation, or null. */\n backupBlobAccess?: 'private' | 'public' | null\n /** Either the persisted access level or a heuristic derived value (never null). */\n backupBlobAccessEffective?: 'private' | 'public'\n backupBlobTokenMasked?: string\n backupsToKeep?: number\n cron?: {\n configFileRelative: string\n humanDescription: null | string\n path: string\n schedule: string\n } | null\n effectiveBackupsToKeep?: number\n error?: string\n hasBackupBlobReadWriteToken?: boolean\n id?: string\n includeMediaForCron?: boolean\n pluginBackupsToKeepOverride?: boolean\n skipMongoCollections?: string[]\n transfer?: {\n deferred?: boolean\n failed: number\n performed: boolean\n pollSecret?: string\n skipped: number\n taskId?: string\n total: number\n transferred: number\n }\n}\n\nexport const BackupSettingsModal: FC = () => {\n const router = useRouter()\n const transferOptId = useId()\n const deleteSourceOptId = useId()\n const dialogRef = useRef<HTMLDialogElement>(null)\n const isPreparingOpenRef = useRef(false)\n const [preview, setPreview] = useState<BackupSourcePreviewResponse | null>(null)\n const [phase, setPhase] = useState<'error' | 'idle' | 'loading' | 'ready'>('idle')\n const [errorMessage, setErrorMessage] = useState<null | string>(null)\n const [selected, setSelected] = useState<Record<string, boolean>>({})\n const [backupAllCollections, setBackupAllCollections] = useState(false)\n const [includeMediaBlobs, setIncludeMediaBlobs] = useState(true)\n const [backupsToKeep, setBackupsToKeep] = useState(10)\n const [backupBlobReadWriteToken, setBackupBlobReadWriteToken] = useState('')\n /**\n * When saving a new raw token, copy backup blobs from the old store. Default on so rotating a\n * token automatically migrates existing archives; delete-from-source stays opt-in.\n */\n const [transferBackupBlobs, setTransferBackupBlobs] = useState(true)\n /**\n * When copying blobs into the new store, also delete them from the old store.\n * Default: off — the user must explicitly opt in to destructive behavior.\n */\n const [deleteBackupBlobsFromSource, setDeleteBackupBlobsFromSource] = useState(false)\n const [, setHasExistingBackupBlobToken] = useState(false)\n const [storedBackupBlobAccess, setStoredBackupBlobAccess] = useState<'private' | 'public' | null>(\n null,\n )\n const [effectiveBackupBlobAccess, setEffectiveBackupBlobAccess] = useState<\n 'private' | 'public' | null\n >(null)\n const [tokenCheck, setTokenCheck] = useState<{\n access?: 'private' | 'public'\n message?: string\n status: 'checking' | 'idle' | 'invalid' | 'valid'\n }>({ status: 'idle' })\n const [pluginOverridesRetention, setPluginOverridesRetention] = useState(false)\n const [cronInfo, setCronInfo] = useState<BackupSettingsApiResponse['cron'] | undefined>(undefined)\n const [transferSummary, setTransferSummary] = useState<\n BackupSettingsApiResponse['transfer'] | null\n >(null)\n const [activeTransfer, setActiveTransfer] = useState<{\n pollSecret: string\n taskId: string\n total: number\n } | null>(null)\n const [transferLive, setTransferLive] = useState<{\n failed: number\n pathname?: string\n total: number\n transferred: number\n } | null>(null)\n const [savePhase, setSavePhase] = useState<\n 'error' | 'idle' | 'saved' | 'saving' | 'transferring'\n >('idle')\n const [saveError, setSaveError] = useState<null | string>(null)\n const [isPreparingOpen, setIsPreparingOpen] = useState(false)\n\n const resetState = useCallback(() => {\n setPreview(null)\n setPhase('idle')\n setErrorMessage(null)\n setSelected({})\n setBackupAllCollections(false)\n setIncludeMediaBlobs(false)\n setBackupsToKeep(10)\n setBackupBlobReadWriteToken('')\n setTransferBackupBlobs(true)\n setDeleteBackupBlobsFromSource(false)\n setHasExistingBackupBlobToken(false)\n setStoredBackupBlobAccess(null)\n setEffectiveBackupBlobAccess(null)\n setTokenCheck({ status: 'idle' })\n setPluginOverridesRetention(false)\n setCronInfo(undefined)\n setTransferSummary(null)\n setActiveTransfer(null)\n setTransferLive(null)\n setSavePhase('idle')\n setSaveError(null)\n isPreparingOpenRef.current = false\n setIsPreparingOpen(false)\n }, [])\n\n useEffect(() => {\n const el = dialogRef.current\n if (!el) {\n return\n }\n const onClose = () => resetState()\n el.addEventListener('close', onClose)\n return () => el.removeEventListener('close', onClose)\n }, [resetState])\n\n const fetchSettingsAndPreview = useCallback(async () => {\n const locale =\n typeof document !== 'undefined' ? (document.documentElement.lang || 'en').slice(0, 2) : 'en'\n const [settingsRes, previewRes] = await Promise.all([\n fetch(backupPluginPublicApiPaths.adminSettings, { method: 'GET' }),\n fetch(backupPluginPublicApiPaths.adminBackupPreview, {\n body: JSON.stringify({ locale }),\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n }),\n ])\n\n const settingsJson = (await settingsRes.json()) as BackupSettingsApiResponse\n if (!settingsRes.ok) {\n throw new Error(settingsJson.error || 'Could not load settings')\n }\n\n const previewJson = (await previewRes.json()) as {\n error?: string\n } & BackupSourcePreviewResponse\n if (!previewRes.ok) {\n throw new Error(previewJson.error || 'Could not load collections')\n }\n\n return { previewJson, settingsJson }\n }, [])\n\n const applyLoadedSettingsPreview = useCallback(\n (settingsJson: BackupSettingsApiResponse, previewJson: BackupSourcePreviewResponse) => {\n setActiveTransfer(null)\n setTransferLive(null)\n setPreview(previewJson)\n setBackupsToKeep(\n typeof settingsJson.backupsToKeep === 'number' ? settingsJson.backupsToKeep : 10,\n )\n setBackupBlobReadWriteToken(settingsJson.backupBlobTokenMasked || '')\n setHasExistingBackupBlobToken(settingsJson.hasBackupBlobReadWriteToken === true)\n setStoredBackupBlobAccess(settingsJson.backupBlobAccess ?? null)\n setEffectiveBackupBlobAccess(settingsJson.backupBlobAccessEffective ?? null)\n setTokenCheck({ status: 'idle' })\n setPluginOverridesRetention(settingsJson.pluginBackupsToKeepOverride === true)\n setCronInfo(settingsJson.cron ?? null)\n setIncludeMediaBlobs(settingsJson.includeMediaForCron === true)\n\n const skip = Array.isArray(settingsJson.skipMongoCollections)\n ? settingsJson.skipMongoCollections\n : []\n setSelected(selectedFromSkipMongoNames(previewJson, skip))\n setBackupAllCollections(skip.length === 0)\n setTransferBackupBlobs(true)\n setDeleteBackupBlobsFromSource(false)\n setPhase('ready')\n },\n [],\n )\n\n const loadPreview = useCallback(async () => {\n setPhase('loading')\n setErrorMessage(null)\n setPreview(null)\n setCronInfo(undefined)\n try {\n const { previewJson, settingsJson } = await fetchSettingsAndPreview()\n applyLoadedSettingsPreview(settingsJson, previewJson)\n } catch (e) {\n setPhase('error')\n setErrorMessage(e instanceof Error ? e.message : 'Could not load backup settings')\n }\n }, [applyLoadedSettingsPreview, fetchSettingsAndPreview])\n\n const openDialog = useCallback(() => {\n if (isPreparingOpenRef.current) {\n return\n }\n isPreparingOpenRef.current = true\n setSavePhase('idle')\n setSaveError(null)\n setIsPreparingOpen(true)\n void (async () => {\n try {\n const { previewJson, settingsJson } = await fetchSettingsAndPreview()\n applyLoadedSettingsPreview(settingsJson, previewJson)\n dialogRef.current?.showModal()\n } catch (e) {\n setPhase('error')\n setErrorMessage(e instanceof Error ? e.message : 'Could not load backup settings')\n setPreview(null)\n setCronInfo(undefined)\n dialogRef.current?.showModal()\n } finally {\n isPreparingOpenRef.current = false\n setIsPreparingOpen(false)\n }\n })()\n }, [applyLoadedSettingsPreview, fetchSettingsAndPreview])\n\n const skipCollections = useMemo(() => {\n if (!preview) {\n return []\n }\n if (backupAllCollections) {\n return []\n }\n return skipMongoNamesFromPreview(preview, selected)\n }, [backupAllCollections, preview, selected])\n\n const mediaGroupIncluded = preview ? backupAllCollections || selected['media'] !== false : false\n const hasMediaBlobOption = Boolean(\n preview && preview.mediaBlobCandidates > 0 && mediaGroupIncluded,\n )\n\n const willSaveNewRawToken = useMemo(\n () => backupBlobReadWriteToken.trim().length > 0 && !/\\*{2,}/.test(backupBlobReadWriteToken),\n [backupBlobReadWriteToken],\n )\n\n const onChangeBackupBlobToken = useCallback((value: string) => {\n setBackupBlobReadWriteToken(value)\n setTokenCheck({ status: 'idle' })\n }, [])\n\n // Auto-validate a freshly pasted/typed token after a short debounce. The masked token coming\n // from the server (contains \"**\") never triggers this because `willSaveNewRawToken` stays false.\n useEffect(() => {\n if (!willSaveNewRawToken) {\n setTokenCheck((prev) => (prev.status === 'idle' ? prev : { status: 'idle' }))\n return\n }\n\n const candidate = backupBlobReadWriteToken.trim()\n if (!candidate) {\n return\n }\n\n let cancelled = false\n const timer = window.setTimeout(async () => {\n if (cancelled) {\n return\n }\n setTokenCheck({ status: 'checking' })\n try {\n const response = await fetch(backupPluginPublicApiPaths.adminValidateBlobToken, {\n body: JSON.stringify({ token: candidate }),\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n })\n if (cancelled) {\n return\n }\n const data = (await response.json()) as {\n access?: 'private' | 'public'\n error?: string\n ok?: boolean\n }\n if (cancelled) {\n return\n }\n if (response.ok && data.ok && (data.access === 'public' || data.access === 'private')) {\n setTokenCheck({ access: data.access, status: 'valid' })\n } else {\n setTokenCheck({ message: data.error || 'Token rejected', status: 'invalid' })\n }\n } catch (error) {\n if (cancelled) {\n return\n }\n setTokenCheck({\n message: error instanceof Error ? error.message : 'Token validation failed',\n status: 'invalid',\n })\n }\n }, 150)\n\n return () => {\n cancelled = true\n window.clearTimeout(timer)\n }\n }, [backupBlobReadWriteToken, willSaveNewRawToken])\n\n const blockSaveForTokenCheck =\n willSaveNewRawToken && (tokenCheck.status === 'checking' || tokenCheck.status === 'invalid')\n\n const tokenStatusPill = (() => {\n if (willSaveNewRawToken) {\n if (tokenCheck.status === 'checking') {\n return <span className=\"backup-item__pill backup-item__pill--neutral\">Checking…</span>\n }\n if (tokenCheck.status === 'valid' && tokenCheck.access) {\n return (\n <span\n className={`backup-item__pill backup-item__pill--${\n tokenCheck.access === 'private' ? 'cron' : 'manual'\n }`}\n >\n {tokenCheck.access === 'private' ? 'Private' : 'Public'}\n </span>\n )\n }\n if (tokenCheck.status === 'invalid') {\n return <span className=\"backup-item__pill backup-item__pill--danger\">Invalid</span>\n }\n return null\n }\n if (effectiveBackupBlobAccess) {\n return (\n <span\n className={`backup-item__pill backup-item__pill--${\n effectiveBackupBlobAccess === 'private' ? 'cron' : 'manual'\n }`}\n title={\n storedBackupBlobAccess\n ? 'Detected and persisted after last validation'\n : 'Heuristic fallback — will be re-validated when saving a new token'\n }\n >\n {effectiveBackupBlobAccess === 'private' ? 'Private' : 'Public'}\n </span>\n )\n }\n return null\n })()\n\n const includeMediaForCron = useMemo(() => {\n if (!hasMediaBlobOption) {\n return false\n }\n return includeMediaBlobs\n }, [hasMediaBlobOption, includeMediaBlobs])\n\n const onToggleGroup = useCallback((groupId: string) => {\n setSelected((prev) => {\n const isOn = prev[groupId] !== false\n return { ...prev, [groupId]: !isOn }\n })\n }, [])\n\n const onToggleBackupAllCollections = useCallback(() => {\n setBackupAllCollections((prev) => {\n const next = !prev\n if (next && preview) {\n setSelected(Object.fromEntries(preview.groups.map((g) => [g.groupId, true])))\n }\n return next\n })\n }, [preview])\n\n const save = useCallback(async () => {\n if (!preview) {\n return\n }\n setSavePhase('saving')\n setSaveError(null)\n setTransferSummary(null)\n setActiveTransfer(null)\n setTransferLive(null)\n try {\n const response = await fetch(backupPluginPublicApiPaths.adminSettings, {\n body: JSON.stringify({\n backupBlobReadWriteToken,\n backupsToKeep,\n deleteBackupBlobsFromSource: transferBackupBlobs && deleteBackupBlobsFromSource,\n includeMediaForCron,\n skipMongoCollections: skipCollections,\n transferBackupBlobs,\n }),\n headers: { 'Content-Type': 'application/json' },\n method: 'PATCH',\n })\n const data = (await response.json()) as BackupSettingsApiResponse\n if (!response.ok) {\n throw new Error(data.error || 'Save failed')\n }\n\n setHasExistingBackupBlobToken(data.hasBackupBlobReadWriteToken === true)\n setBackupBlobReadWriteToken(data.backupBlobTokenMasked || '')\n setStoredBackupBlobAccess(data.backupBlobAccess ?? null)\n setEffectiveBackupBlobAccess(data.backupBlobAccessEffective ?? null)\n setTokenCheck({ status: 'idle' })\n\n const tr = data.transfer\n if (tr?.performed && tr.deferred && tr.taskId && tr.pollSecret) {\n setActiveTransfer({ pollSecret: tr.pollSecret, taskId: tr.taskId, total: tr.total })\n setTransferLive({ failed: 0, total: tr.total, transferred: 0 })\n setSavePhase('transferring')\n return\n }\n\n setTransferSummary(tr ?? null)\n setSavePhase('saved')\n router.refresh()\n if (!tr?.performed) {\n window.setTimeout(() => {\n setSavePhase('idle')\n dialogRef.current?.close()\n }, 800)\n } else {\n window.setTimeout(() => {\n setSavePhase('idle')\n dialogRef.current?.close()\n }, 1200)\n }\n } catch (e) {\n setSavePhase('error')\n setSaveError(e instanceof Error ? e.message : 'Save failed')\n }\n }, [\n preview,\n backupsToKeep,\n backupBlobReadWriteToken,\n skipCollections,\n includeMediaForCron,\n transferBackupBlobs,\n deleteBackupBlobsFromSource,\n router,\n ])\n\n useEffect(() => {\n if (!activeTransfer) {\n return\n }\n\n let cancelled = false\n let intervalId: null | number = null\n let successCloseTimer: null | number = null\n\n const stopPolling = () => {\n if (intervalId != null) {\n window.clearInterval(intervalId)\n intervalId = null\n }\n }\n\n const pollOnce = async () => {\n const res = await fetch(backupPluginPublicApiPaths.adminTask(activeTransfer.taskId), {\n cache: 'no-store',\n headers: { Authorization: `Bearer ${activeTransfer.pollSecret}` },\n })\n if (!res.ok || cancelled) {\n return\n }\n const task = (await res.json()) as BackupTaskProgress\n const parsed = parseBlobTransferTaskMessage(task.message)\n if (parsed) {\n setTransferLive({\n failed: parsed.failed,\n pathname: parsed.pathname,\n total: parsed.total,\n transferred: parsed.transferred,\n })\n }\n if (task.status === 'completed') {\n stopPolling()\n const final = parseBlobTransferTaskMessage(task.message)\n setTransferSummary({\n deferred: false,\n failed: final?.failed ?? 0,\n performed: true,\n skipped: 0,\n total: final?.total ?? activeTransfer.total,\n transferred: final?.transferred ?? 0,\n })\n setActiveTransfer(null)\n setTransferLive(null)\n setSavePhase('saved')\n try {\n const settingsRes = await fetch(backupPluginPublicApiPaths.adminSettings, {\n method: 'GET',\n })\n const refreshed = (await settingsRes.json()) as BackupSettingsApiResponse\n if (settingsRes.ok) {\n setBackupBlobReadWriteToken(refreshed.backupBlobTokenMasked || '')\n setHasExistingBackupBlobToken(refreshed.hasBackupBlobReadWriteToken === true)\n }\n } catch {\n /* ignore */\n }\n router.refresh()\n successCloseTimer = window.setTimeout(() => {\n successCloseTimer = null\n setSavePhase('idle')\n setTransferSummary(null)\n dialogRef.current?.close()\n }, 1400)\n return\n }\n if (task.status === 'failed') {\n stopPolling()\n setSavePhase('error')\n setSaveError(task.error || task.message || 'Transfer failed')\n setActiveTransfer(null)\n setTransferLive(null)\n }\n }\n\n intervalId = window.setInterval(() => void pollOnce(), 900)\n void pollOnce()\n return () => {\n cancelled = true\n stopPolling()\n if (successCloseTimer != null) {\n window.clearTimeout(successCloseTimer)\n }\n }\n }, [activeTransfer, router])\n\n const retentionDisabled = pluginOverridesRetention\n\n return (\n <>\n <Button buttonStyle=\"secondary\" disabled={isPreparingOpen} onClick={openDialog} size=\"small\">\n {isPreparingOpen ? 'Loading…' : 'Backup settings'}\n </Button>\n\n {/* Native <dialog>: backdrop dismiss; element not in jsx-a11y interactive list */}\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}\n <dialog\n className=\"backup-confirm-dialog backup-confirm-dialog--settings\"\n onMouseDown={(e) => closeNativeDialogOnBackdropPointer(e, dialogRef)}\n ref={dialogRef}\n >\n <p className=\"backup-confirm-dialog__title\">Scheduled backup settings</p>\n <p className=\"backup-confirm-dialog__subtitle backup-confirm-dialog__subtitle--with-help\">\n <span className=\"backup-confirm-dialog__subtitle-text\">{TIP_SETTINGS_SUBTITLE}</span>\n </p>\n\n <div className=\"backup-confirm-dialog__body restore-preview\">\n {phase !== 'idle' ? (\n <>\n <p className=\"restore-preview__sticky-heading\">Schedule</p>\n {phase === 'loading' ? (\n <div\n aria-live=\"polite\"\n className=\"restore-preview__loading-block restore-preview__loading-block--section\"\n >\n <p className=\"restore-preview__status\">Loading cron configuration…</p>\n <div className=\"restore-preview__loading-line\" />\n <div className=\"restore-preview__loading-line restore-preview__loading-line--short\" />\n </div>\n ) : phase === 'error' ? (\n <p className=\"restore-preview__intro\">Schedule details could not be loaded.</p>\n ) : cronInfo ? (\n <>\n <p className=\"restore-preview__intro\">\n Active job: <code>{cronInfo.configFileRelative}</code> — edit and redeploy to\n change the schedule.\n </p>\n <div aria-label=\"Configured schedule\" className=\"restore-preview__settings-block\">\n <p className=\"restore-preview__settings-row\">\n <span className=\"restore-preview__settings-k\">HTTP path</span>{' '}\n <code>{cronInfo.path}</code>\n </p>\n <p className=\"restore-preview__settings-row\">\n <span className=\"restore-preview__settings-k\">Cron expression</span>{' '}\n <code>{cronInfo.schedule}</code>\n </p>\n {cronInfo.humanDescription ? (\n <p className=\"restore-preview__settings-human\">{cronInfo.humanDescription}</p>\n ) : (\n <p className=\"restore-preview__settings-human restore-preview__settings-human--muted\">\n Could not turn the cron expression into a short description.\n </p>\n )}\n </div>\n </>\n ) : (\n <>\n <p className=\"restore-preview__intro\">\n No vercel <code>crons</code> entry for the backup path yet. You can either setup\n an external service to call /api/backup-mongodb/cron/run with your cron secret\n or use Vercel. To use vercel create a file <code>vercel.json</code> in your\n project root with the following content:\n </p>\n <p className=\"restore-preview__settings-hint\">Example</p>\n <pre className=\"restore-preview__settings-snippet\">{`{\n \"crons\": [\n {\n \"path\": \"/api/backup-mongodb/cron/run\",\n \"schedule\": \"0 3 * * *\"\n }\n ]\n}`}</pre>\n <p>\n Then add a <code>CRON_SECRET</code> environment variable to your Vercel project\n and redeploy on Vercel so the cron job is registered.\n </p>\n </>\n )}\n </>\n ) : null}\n\n <p className=\"restore-preview__sticky-heading\">Retention</p>\n <p className=\"restore-preview__intro\">\n {retentionDisabled ? (\n <>\n Locked by <code>backupMongodbPlugin({'{ backupsToKeep }'})</code> in Payload config.\n </>\n ) : (\n <>Oldest cron archives are deleted once the count exceeds this limit.</>\n )}\n </p>\n <div className=\"restore-preview__settings-fields\">\n <label className=\"restore-preview__settings-label\" htmlFor=\"backups-to-keep\">\n Cron backups to keep\n </label>\n <input\n aria-label=\"Cron backups to keep\"\n className=\"restore-preview__settings-input\"\n disabled={retentionDisabled}\n id=\"backups-to-keep\"\n max={365}\n min={1}\n onChange={(e) => setBackupsToKeep(Number(e.target.value) || 1)}\n type=\"number\"\n value={backupsToKeep}\n />\n </div>\n\n <p className=\"restore-preview__sticky-heading\">\n Dedicated backup storage{' '}\n <span className=\"restore-preview__sticky-heading-hint\">(optional)</span>\n </p>\n <p className=\"restore-preview__intro\">\n Separate Vercel Blob token for <code>backups/</code>. Without one, archives share the\n default media store.\n </p>\n <div className=\"restore-preview__settings-fields\">\n <label className=\"restore-preview__settings-label\" htmlFor=\"backup-blob-token\">\n Backup Blob read/write token\n </label>\n <div className=\"restore-preview__blob-token-row\">\n <input\n aria-label=\"Backup Blob read/write token\"\n autoComplete=\"off\"\n className=\"restore-preview__settings-input restore-preview__settings-input--wide\"\n id=\"backup-blob-token\"\n onChange={(e) => onChangeBackupBlobToken(e.target.value)}\n placeholder=\"vercel_blob_rw_...\"\n spellCheck={false}\n type=\"text\"\n value={backupBlobReadWriteToken}\n />\n <span className=\"restore-preview__blob-token-pill-slot\">{tokenStatusPill}</span>\n </div>\n {tokenCheck.status === 'invalid' && tokenCheck.message ? (\n <p aria-live=\"polite\" className=\"restore-preview__blob-token-error\">\n {tokenCheck.message}\n </p>\n ) : null}\n {savePhase === 'transferring' && transferLive && transferLive.total > 0 ? (\n <div aria-live=\"polite\" className=\"restore-preview__transfer-panel\">\n <div className=\"restore-preview__transfer-bar-track\">\n <div\n className=\"restore-preview__transfer-bar-fill\"\n style={{\n width: `${Math.min(\n 100,\n ((transferLive.transferred + transferLive.failed) / transferLive.total) *\n 100,\n )}%`,\n }}\n />\n </div>\n <p className=\"restore-preview__transfer-meta\">\n Copying backup files: {transferLive.transferred + transferLive.failed} /{' '}\n {transferLive.total}\n {transferLive.failed > 0 ? ` (${transferLive.failed} failed)` : ''}\n {transferLive.pathname ? (\n <>\n <br />\n <span\n className=\"restore-preview__transfer-path\"\n title={transferLive.pathname}\n >\n {transferLive.pathname.length > 56\n ? `${transferLive.pathname.slice(0, 28)}…${transferLive.pathname.slice(-24)}`\n : transferLive.pathname}\n </span>\n </>\n ) : null}\n </p>\n </div>\n ) : null}\n {willSaveNewRawToken ? (\n <>\n <div className=\"field-type checkbox backup-dashboard__collapsible-checkbox restore-preview__blob-transfer-row restore-preview__blob-transfer-row--with-help-tip\">\n <input\n aria-label=\"Copy existing backup files into this storage when saving\"\n checked={transferBackupBlobs}\n className=\"checkbox-input__input\"\n id={transferOptId}\n onChange={(e) => setTransferBackupBlobs(e.target.checked)}\n type=\"checkbox\"\n />\n <label className=\"field-label\" htmlFor={transferOptId}>\n Copy existing backup files into this storage when saving\n </label>\n <SettingsHelpTip multiline tip={TIP_TRANSFER_COPY} />\n </div>\n {transferBackupBlobs ? (\n <div className=\"field-type checkbox backup-dashboard__collapsible-checkbox restore-preview__blob-transfer-row restore-preview__blob-transfer-row--with-help-tip\">\n <input\n aria-label=\"Delete from previous storage after successful copy\"\n checked={deleteBackupBlobsFromSource}\n className=\"checkbox-input__input\"\n id={deleteSourceOptId}\n onChange={(e) => setDeleteBackupBlobsFromSource(e.target.checked)}\n type=\"checkbox\"\n />\n <label className=\"field-label\" htmlFor={deleteSourceOptId}>\n Delete from previous storage after successful copy\n </label>\n <SettingsHelpTip multiline tip={TIP_TRANSFER_DELETE} />\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n\n <CollectionBackupPreviewBody\n embedded\n errorMessage={errorMessage}\n includeAllCollections={backupAllCollections}\n includeAllLabel=\"Backup all collections\"\n includeMediaBlobs={includeMediaBlobs}\n onRetry={loadPreview}\n onToggleGroup={onToggleGroup}\n onToggleIncludeAllCollections={onToggleBackupAllCollections}\n onToggleIncludeMedia={() => setIncludeMediaBlobs((v) => !v)}\n phase={phase}\n preview={preview}\n selected={selected}\n />\n\n {saveError ? (\n <p className=\"restore-preview__error restore-preview__error--inline\">{saveError}</p>\n ) : null}\n {savePhase === 'saving' ? (\n <p className=\"restore-preview__status restore-preview__status--footer\">\n Saving settings…\n </p>\n ) : null}\n {transferSummary?.performed ? (\n <p className=\"restore-preview__status restore-preview__status--footer\">\n Migrated backups: {transferSummary.transferred}/{transferSummary.total}\n {transferSummary.failed > 0 ? `, failed: ${transferSummary.failed}` : ''}\n </p>\n ) : null}\n </div>\n\n <div className=\"backup-confirm-dialog__actions\">\n <Button\n buttonStyle=\"primary\"\n disabled={\n phase !== 'ready' ||\n savePhase === 'saving' ||\n savePhase === 'transferring' ||\n blockSaveForTokenCheck\n }\n onClick={() => void save()}\n size=\"small\"\n >\n {savePhase === 'transferring'\n ? 'Transferring…'\n : savePhase === 'saving'\n ? 'Saving…'\n : savePhase === 'saved'\n ? 'Saved'\n : 'Save settings'}\n </Button>\n <Button buttonStyle=\"secondary\" onClick={() => dialogRef.current?.close()} size=\"small\">\n Cancel\n </Button>\n </div>\n </dialog>\n </>\n )\n}\n"],"names":["Button","useRouter","useCallback","useEffect","useId","useMemo","useRef","useState","backupPluginPublicApiPaths","selectedFromSkipMongoNames","skipMongoNamesFromPreview","closeNativeDialogOnBackdropPointer","CollectionBackupPreviewBody","parseBlobTransferTaskMessage","msg","o","JSON","parse","total","transferred","failed","pathname","undefined","TIP_SETTINGS_SUBTITLE","TIP_TRANSFER_COPY","TIP_TRANSFER_DELETE","settingsHelpIconClassName","multiline","filter","Boolean","join","SettingsHelpTip","tip","elRef","syncTooltipAnchor","el","current","r","getBoundingClientRect","style","setProperty","left","width","top","button","aria-label","className","data-tip","onFocus","onMouseEnter","ref","title","type","BackupSettingsModal","router","transferOptId","deleteSourceOptId","dialogRef","isPreparingOpenRef","preview","setPreview","phase","setPhase","errorMessage","setErrorMessage","selected","setSelected","backupAllCollections","setBackupAllCollections","includeMediaBlobs","setIncludeMediaBlobs","backupsToKeep","setBackupsToKeep","backupBlobReadWriteToken","setBackupBlobReadWriteToken","transferBackupBlobs","setTransferBackupBlobs","deleteBackupBlobsFromSource","setDeleteBackupBlobsFromSource","setHasExistingBackupBlobToken","storedBackupBlobAccess","setStoredBackupBlobAccess","effectiveBackupBlobAccess","setEffectiveBackupBlobAccess","tokenCheck","setTokenCheck","status","pluginOverridesRetention","setPluginOverridesRetention","cronInfo","setCronInfo","transferSummary","setTransferSummary","activeTransfer","setActiveTransfer","transferLive","setTransferLive","savePhase","setSavePhase","saveError","setSaveError","isPreparingOpen","setIsPreparingOpen","resetState","onClose","addEventListener","removeEventListener","fetchSettingsAndPreview","locale","document","documentElement","lang","slice","settingsRes","previewRes","Promise","all","fetch","adminSettings","method","adminBackupPreview","body","stringify","headers","settingsJson","json","ok","Error","error","previewJson","applyLoadedSettingsPreview","backupBlobTokenMasked","hasBackupBlobReadWriteToken","backupBlobAccess","backupBlobAccessEffective","pluginBackupsToKeepOverride","cron","includeMediaForCron","skip","Array","isArray","skipMongoCollections","length","loadPreview","e","message","openDialog","showModal","skipCollections","mediaGroupIncluded","hasMediaBlobOption","mediaBlobCandidates","willSaveNewRawToken","trim","test","onChangeBackupBlobToken","value","prev","candidate","cancelled","timer","window","setTimeout","response","adminValidateBlobToken","token","data","access","clearTimeout","blockSaveForTokenCheck","tokenStatusPill","span","onToggleGroup","groupId","isOn","onToggleBackupAllCollections","next","Object","fromEntries","groups","map","g","save","tr","transfer","performed","deferred","taskId","pollSecret","refresh","close","intervalId","successCloseTimer","stopPolling","clearInterval","pollOnce","res","adminTask","cache","Authorization","task","parsed","final","skipped","refreshed","setInterval","retentionDisabled","buttonStyle","disabled","onClick","size","dialog","onMouseDown","p","div","aria-live","code","configFileRelative","path","schedule","humanDescription","pre","label","htmlFor","input","id","max","min","onChange","Number","target","autoComplete","placeholder","spellCheck","Math","br","checked","embedded","includeAllCollections","includeAllLabel","onRetry","onToggleIncludeAllCollections","onToggleIncludeMedia","v"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { FC } from 'react';
2
+ import type { BackupSourcePreviewResponse } from '../../core/backupSourcePreview';
3
+ export interface CollectionBackupPreviewBodyProps {
4
+ /** When true, omit the scrollable dialog body wrapper (use inside another `restore-preview` container). */
5
+ embedded?: boolean;
6
+ errorMessage: null | string;
7
+ includeAllCollections: boolean;
8
+ includeAllLabel?: string;
9
+ includeMediaBlobs: boolean;
10
+ onRetry: () => void;
11
+ onToggleGroup: (groupId: string) => void;
12
+ onToggleIncludeAllCollections: () => void;
13
+ onToggleIncludeMedia: () => void;
14
+ phase: 'error' | 'idle' | 'loading' | 'ready';
15
+ preview: BackupSourcePreviewResponse | null;
16
+ selected: Record<string, boolean>;
17
+ }
18
+ export declare const CollectionBackupPreviewBody: FC<CollectionBackupPreviewBodyProps>;
@@ -0,0 +1,267 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { Button } from '@payloadcms/ui';
4
+ function hiddenPills(reasons) {
5
+ const out = [];
6
+ if (reasons.includes('collection-config')) {
7
+ out.push('Hidden in admin');
8
+ }
9
+ return out;
10
+ }
11
+ export const CollectionBackupPreviewBody = ({ embedded = false, errorMessage, includeAllCollections, includeAllLabel = 'Backup all collections', includeMediaBlobs, onRetry, onToggleGroup, onToggleIncludeAllCollections, onToggleIncludeMedia, phase, preview, selected })=>{
12
+ const mediaGroupIncluded = preview ? includeAllCollections || selected['media'] !== false : false;
13
+ const hasMediaBlobOption = Boolean(preview && preview.mediaBlobCandidates > 0 && mediaGroupIncluded);
14
+ const inner = /*#__PURE__*/ _jsxs(_Fragment, {
15
+ children: [
16
+ phase === 'loading' && /*#__PURE__*/ _jsxs("div", {
17
+ "aria-live": "polite",
18
+ className: "restore-preview__loading-block",
19
+ children: [
20
+ /*#__PURE__*/ _jsx("p", {
21
+ className: "restore-preview__status",
22
+ children: "Loading collections…"
23
+ }),
24
+ /*#__PURE__*/ _jsx("div", {
25
+ className: "restore-preview__loading-line"
26
+ }),
27
+ /*#__PURE__*/ _jsx("div", {
28
+ className: "restore-preview__loading-line restore-preview__loading-line--short"
29
+ }),
30
+ /*#__PURE__*/ _jsx("div", {
31
+ className: "restore-preview__loading-line"
32
+ })
33
+ ]
34
+ }),
35
+ phase === 'error' && /*#__PURE__*/ _jsxs("div", {
36
+ className: "restore-preview__error",
37
+ children: [
38
+ /*#__PURE__*/ _jsx("p", {
39
+ children: errorMessage
40
+ }),
41
+ /*#__PURE__*/ _jsx(Button, {
42
+ buttonStyle: "secondary",
43
+ onClick: ()=>void onRetry(),
44
+ size: "small",
45
+ children: "Retry"
46
+ })
47
+ ]
48
+ }),
49
+ phase === 'ready' && preview && /*#__PURE__*/ _jsxs(_Fragment, {
50
+ children: [
51
+ /*#__PURE__*/ _jsx("p", {
52
+ className: "restore-preview__sticky-heading",
53
+ children: "Collection selection"
54
+ }),
55
+ /*#__PURE__*/ _jsx("p", {
56
+ className: "restore-preview__intro",
57
+ children: "Choose which collections to include. Version drafts are grouped with their collection. Collections with no documents still appear so you can exclude them explicitly. If you add new collections later, they are automatically included in backups by default."
58
+ }),
59
+ preview.groups.length === 0 && /*#__PURE__*/ _jsx("p", {
60
+ className: "restore-preview__empty",
61
+ children: "No collections found to list."
62
+ }),
63
+ includeAllCollections ? /*#__PURE__*/ _jsxs("div", {
64
+ className: "restore-preview__all-block",
65
+ children: [
66
+ /*#__PURE__*/ _jsxs("label", {
67
+ className: "restore-preview__all-block-head",
68
+ children: [
69
+ /*#__PURE__*/ _jsx("input", {
70
+ "aria-label": includeAllLabel,
71
+ checked: true,
72
+ className: "checkbox-input__input restore-preview__group-check",
73
+ onChange: onToggleIncludeAllCollections,
74
+ type: "checkbox"
75
+ }),
76
+ /*#__PURE__*/ _jsx("span", {
77
+ className: "restore-preview__media-label",
78
+ children: includeAllLabel
79
+ })
80
+ ]
81
+ }),
82
+ preview.groups.length > 0 ? /*#__PURE__*/ _jsx("ul", {
83
+ "aria-label": "Collections to back up",
84
+ className: "restore-preview__all-list",
85
+ children: preview.groups.map((g)=>{
86
+ const mainDocs = g.main?.docCount ?? 0;
87
+ const versionDocs = g.versions?.docCount ?? 0;
88
+ const totalDocs = mainDocs + versionDocs;
89
+ return /*#__PURE__*/ _jsxs("li", {
90
+ className: "restore-preview__all-item",
91
+ children: [
92
+ /*#__PURE__*/ _jsx("span", {
93
+ className: "restore-preview__all-name",
94
+ children: g.displayTitle
95
+ }),
96
+ /*#__PURE__*/ _jsxs("span", {
97
+ className: "restore-preview__all-count",
98
+ children: [
99
+ totalDocs,
100
+ " doc",
101
+ totalDocs === 1 ? '' : 's',
102
+ versionDocs > 0 ? /*#__PURE__*/ _jsxs(_Fragment, {
103
+ children: [
104
+ ' ',
105
+ /*#__PURE__*/ _jsxs("span", {
106
+ className: "restore-preview__all-count-sub",
107
+ children: [
108
+ "(incl. ",
109
+ versionDocs,
110
+ " version",
111
+ versionDocs === 1 ? '' : 's',
112
+ ")"
113
+ ]
114
+ })
115
+ ]
116
+ }) : null
117
+ ]
118
+ })
119
+ ]
120
+ }, g.groupId);
121
+ })
122
+ }) : null,
123
+ hasMediaBlobOption ? /*#__PURE__*/ _jsxs("label", {
124
+ className: "restore-preview__media-block restore-preview__media-block--nested",
125
+ children: [
126
+ /*#__PURE__*/ _jsx("input", {
127
+ "aria-label": `Include media files from storage (${preview.mediaBlobCandidates} files)`,
128
+ checked: includeMediaBlobs,
129
+ className: "checkbox-input__input restore-preview__group-check",
130
+ onChange: onToggleIncludeMedia,
131
+ type: "checkbox"
132
+ }),
133
+ /*#__PURE__*/ _jsxs("span", {
134
+ className: "restore-preview__media-label",
135
+ children: [
136
+ "Include media files from storage? (",
137
+ preview.mediaBlobCandidates,
138
+ " file",
139
+ preview.mediaBlobCandidates === 1 ? '' : 's',
140
+ ")"
141
+ ]
142
+ })
143
+ ]
144
+ }) : null
145
+ ]
146
+ }) : /*#__PURE__*/ _jsxs(_Fragment, {
147
+ children: [
148
+ /*#__PURE__*/ _jsxs("label", {
149
+ className: "restore-preview__media-block",
150
+ children: [
151
+ /*#__PURE__*/ _jsx("input", {
152
+ "aria-label": includeAllLabel,
153
+ checked: false,
154
+ className: "checkbox-input__input restore-preview__group-check",
155
+ onChange: onToggleIncludeAllCollections,
156
+ type: "checkbox"
157
+ }),
158
+ /*#__PURE__*/ _jsx("span", {
159
+ className: "restore-preview__media-label",
160
+ children: includeAllLabel
161
+ })
162
+ ]
163
+ }),
164
+ /*#__PURE__*/ _jsx("ul", {
165
+ "aria-label": "Collections to back up",
166
+ className: "restore-preview__list",
167
+ children: preview.groups.map((g)=>{
168
+ const adminPills = hiddenPills(g.adminHiddenReasons);
169
+ const isMedia = g.groupId === 'media';
170
+ return /*#__PURE__*/ _jsxs("li", {
171
+ className: "restore-preview__group",
172
+ children: [
173
+ /*#__PURE__*/ _jsx("div", {
174
+ className: "restore-preview__group-head",
175
+ children: /*#__PURE__*/ _jsxs("label", {
176
+ className: "restore-preview__group-label",
177
+ children: [
178
+ /*#__PURE__*/ _jsx("input", {
179
+ "aria-label": `Include collection ${g.displayTitle} in backup`,
180
+ checked: selected[g.groupId] !== false,
181
+ className: "checkbox-input__input restore-preview__group-check",
182
+ onChange: ()=>onToggleGroup(g.groupId),
183
+ type: "checkbox"
184
+ }),
185
+ /*#__PURE__*/ _jsx("span", {
186
+ className: "restore-preview__group-title",
187
+ children: g.displayTitle
188
+ })
189
+ ]
190
+ })
191
+ }),
192
+ /*#__PURE__*/ _jsxs("div", {
193
+ className: "restore-preview__sublines",
194
+ children: [
195
+ g.main ? /*#__PURE__*/ _jsxs("div", {
196
+ className: "restore-preview__subline",
197
+ children: [
198
+ g.main.docCount,
199
+ " doc",
200
+ g.main.docCount === 1 ? '' : 's',
201
+ " to include"
202
+ ]
203
+ }) : null,
204
+ g.versions ? /*#__PURE__*/ _jsxs("div", {
205
+ className: "restore-preview__subline",
206
+ children: [
207
+ g.versions.docCount,
208
+ " version doc",
209
+ g.versions.docCount === 1 ? '' : 's',
210
+ " to include"
211
+ ]
212
+ }) : null,
213
+ isMedia && selected['media'] !== false && preview.mediaBlobCandidates === 0 && (g.main?.docCount ?? 0) + (g.versions?.docCount ?? 0) > 0 && /*#__PURE__*/ _jsx("div", {
214
+ className: "restore-preview__note restore-preview__note--media",
215
+ children: "No blob paths in media docs — only collection data will be in the backup file."
216
+ }),
217
+ isMedia && hasMediaBlobOption && /*#__PURE__*/ _jsxs("label", {
218
+ className: "restore-preview__media-block restore-preview__media-block--nested",
219
+ children: [
220
+ /*#__PURE__*/ _jsx("input", {
221
+ "aria-label": `Include media files from storage (${preview.mediaBlobCandidates} files)`,
222
+ checked: includeMediaBlobs,
223
+ className: "checkbox-input__input restore-preview__group-check",
224
+ onChange: onToggleIncludeMedia,
225
+ type: "checkbox"
226
+ }),
227
+ /*#__PURE__*/ _jsxs("span", {
228
+ className: "restore-preview__media-label",
229
+ children: [
230
+ "Include media files from storage? (",
231
+ preview.mediaBlobCandidates,
232
+ " file",
233
+ preview.mediaBlobCandidates === 1 ? '' : 's',
234
+ ")"
235
+ ]
236
+ })
237
+ ]
238
+ }),
239
+ adminPills.length > 0 && /*#__PURE__*/ _jsx("div", {
240
+ className: "restore-preview__pills",
241
+ children: adminPills.map((t)=>/*#__PURE__*/ _jsx("span", {
242
+ className: "restore-preview__pill",
243
+ children: t
244
+ }, t))
245
+ })
246
+ ]
247
+ })
248
+ ]
249
+ }, g.groupId);
250
+ })
251
+ })
252
+ ]
253
+ })
254
+ ]
255
+ })
256
+ ]
257
+ });
258
+ if (embedded) {
259
+ return inner;
260
+ }
261
+ return /*#__PURE__*/ _jsx("div", {
262
+ className: "backup-confirm-dialog__body restore-preview",
263
+ children: inner
264
+ });
265
+ };
266
+
267
+ //# sourceMappingURL=CollectionBackupPreviewBody.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/BackupDashboard/CollectionBackupPreviewBody.client.tsx"],"sourcesContent":["'use client'\n\nimport type { FC } from 'react'\n\nimport { Button } from '@payloadcms/ui'\n\nimport type { BackupSourcePreviewResponse } from '../../core/backupSourcePreview'\n\nfunction hiddenPills(\n reasons: BackupSourcePreviewResponse['groups'][number]['adminHiddenReasons'],\n): string[] {\n const out: string[] = []\n if (reasons.includes('collection-config')) {\n out.push('Hidden in admin')\n }\n return out\n}\n\nexport interface CollectionBackupPreviewBodyProps {\n /** When true, omit the scrollable dialog body wrapper (use inside another `restore-preview` container). */\n embedded?: boolean\n errorMessage: null | string\n includeAllCollections: boolean\n includeAllLabel?: string\n includeMediaBlobs: boolean\n onRetry: () => void\n onToggleGroup: (groupId: string) => void\n onToggleIncludeAllCollections: () => void\n onToggleIncludeMedia: () => void\n phase: 'error' | 'idle' | 'loading' | 'ready'\n preview: BackupSourcePreviewResponse | null\n selected: Record<string, boolean>\n}\n\nexport const CollectionBackupPreviewBody: FC<CollectionBackupPreviewBodyProps> = ({\n embedded = false,\n errorMessage,\n includeAllCollections,\n includeAllLabel = 'Backup all collections',\n includeMediaBlobs,\n onRetry,\n onToggleGroup,\n onToggleIncludeAllCollections,\n onToggleIncludeMedia,\n phase,\n preview,\n selected,\n}) => {\n const mediaGroupIncluded = preview ? includeAllCollections || selected['media'] !== false : false\n const hasMediaBlobOption = Boolean(\n preview && preview.mediaBlobCandidates > 0 && mediaGroupIncluded,\n )\n\n const inner = (\n <>\n {phase === 'loading' && (\n <div aria-live=\"polite\" className=\"restore-preview__loading-block\">\n <p className=\"restore-preview__status\">Loading collections…</p>\n <div className=\"restore-preview__loading-line\" />\n <div className=\"restore-preview__loading-line restore-preview__loading-line--short\" />\n <div className=\"restore-preview__loading-line\" />\n </div>\n )}\n\n {phase === 'error' && (\n <div className=\"restore-preview__error\">\n <p>{errorMessage}</p>\n <Button buttonStyle=\"secondary\" onClick={() => void onRetry()} size=\"small\">\n Retry\n </Button>\n </div>\n )}\n\n {phase === 'ready' && preview && (\n <>\n <p className=\"restore-preview__sticky-heading\">Collection selection</p>\n <p className=\"restore-preview__intro\">\n Choose which collections to include. Version drafts are grouped with their collection.\n Collections with no documents still appear so you can exclude them explicitly. If you\n add new collections later, they are automatically included in backups by default.\n </p>\n\n {preview.groups.length === 0 && (\n <p className=\"restore-preview__empty\">No collections found to list.</p>\n )}\n\n {includeAllCollections ? (\n <div className=\"restore-preview__all-block\">\n <label className=\"restore-preview__all-block-head\">\n <input\n aria-label={includeAllLabel}\n checked\n className=\"checkbox-input__input restore-preview__group-check\"\n onChange={onToggleIncludeAllCollections}\n type=\"checkbox\"\n />\n <span className=\"restore-preview__media-label\">{includeAllLabel}</span>\n </label>\n {preview.groups.length > 0 ? (\n <ul aria-label=\"Collections to back up\" className=\"restore-preview__all-list\">\n {preview.groups.map((g) => {\n const mainDocs = g.main?.docCount ?? 0\n const versionDocs = g.versions?.docCount ?? 0\n const totalDocs = mainDocs + versionDocs\n return (\n <li className=\"restore-preview__all-item\" key={g.groupId}>\n <span className=\"restore-preview__all-name\">{g.displayTitle}</span>\n <span className=\"restore-preview__all-count\">\n {totalDocs} doc{totalDocs === 1 ? '' : 's'}\n {versionDocs > 0 ? (\n <>\n {' '}\n <span className=\"restore-preview__all-count-sub\">\n (incl. {versionDocs} version{versionDocs === 1 ? '' : 's'})\n </span>\n </>\n ) : null}\n </span>\n </li>\n )\n })}\n </ul>\n ) : null}\n {hasMediaBlobOption ? (\n <label className=\"restore-preview__media-block restore-preview__media-block--nested\">\n <input\n aria-label={`Include media files from storage (${preview.mediaBlobCandidates} files)`}\n checked={includeMediaBlobs}\n className=\"checkbox-input__input restore-preview__group-check\"\n onChange={onToggleIncludeMedia}\n type=\"checkbox\"\n />\n <span className=\"restore-preview__media-label\">\n Include media files from storage? ({preview.mediaBlobCandidates} file\n {preview.mediaBlobCandidates === 1 ? '' : 's'})\n </span>\n </label>\n ) : null}\n </div>\n ) : (\n <>\n <label className=\"restore-preview__media-block\">\n <input\n aria-label={includeAllLabel}\n checked={false}\n className=\"checkbox-input__input restore-preview__group-check\"\n onChange={onToggleIncludeAllCollections}\n type=\"checkbox\"\n />\n <span className=\"restore-preview__media-label\">{includeAllLabel}</span>\n </label>\n\n <ul aria-label=\"Collections to back up\" className=\"restore-preview__list\">\n {preview.groups.map((g) => {\n const adminPills = hiddenPills(g.adminHiddenReasons)\n const isMedia = g.groupId === 'media'\n return (\n <li className=\"restore-preview__group\" key={g.groupId}>\n <div className=\"restore-preview__group-head\">\n <label className=\"restore-preview__group-label\">\n <input\n aria-label={`Include collection ${g.displayTitle} in backup`}\n checked={selected[g.groupId] !== false}\n className=\"checkbox-input__input restore-preview__group-check\"\n onChange={() => onToggleGroup(g.groupId)}\n type=\"checkbox\"\n />\n <span className=\"restore-preview__group-title\">{g.displayTitle}</span>\n </label>\n </div>\n <div className=\"restore-preview__sublines\">\n {g.main ? (\n <div className=\"restore-preview__subline\">\n {g.main.docCount} doc{g.main.docCount === 1 ? '' : 's'} to include\n </div>\n ) : null}\n {g.versions ? (\n <div className=\"restore-preview__subline\">\n {g.versions.docCount} version doc\n {g.versions.docCount === 1 ? '' : 's'} to include\n </div>\n ) : null}\n {isMedia &&\n selected['media'] !== false &&\n preview.mediaBlobCandidates === 0 &&\n (g.main?.docCount ?? 0) + (g.versions?.docCount ?? 0) > 0 && (\n <div className=\"restore-preview__note restore-preview__note--media\">\n No blob paths in media docs — only collection data will be in the\n backup file.\n </div>\n )}\n {isMedia && hasMediaBlobOption && (\n <label className=\"restore-preview__media-block restore-preview__media-block--nested\">\n <input\n aria-label={`Include media files from storage (${preview.mediaBlobCandidates} files)`}\n checked={includeMediaBlobs}\n className=\"checkbox-input__input restore-preview__group-check\"\n onChange={onToggleIncludeMedia}\n type=\"checkbox\"\n />\n <span className=\"restore-preview__media-label\">\n Include media files from storage? ({preview.mediaBlobCandidates} file\n {preview.mediaBlobCandidates === 1 ? '' : 's'})\n </span>\n </label>\n )}\n {adminPills.length > 0 && (\n <div className=\"restore-preview__pills\">\n {adminPills.map((t) => (\n <span className=\"restore-preview__pill\" key={t}>\n {t}\n </span>\n ))}\n </div>\n )}\n </div>\n </li>\n )\n })}\n </ul>\n </>\n )}\n </>\n )}\n </>\n )\n\n if (embedded) {\n return inner\n }\n\n return <div className=\"backup-confirm-dialog__body restore-preview\">{inner}</div>\n}\n"],"names":["Button","hiddenPills","reasons","out","includes","push","CollectionBackupPreviewBody","embedded","errorMessage","includeAllCollections","includeAllLabel","includeMediaBlobs","onRetry","onToggleGroup","onToggleIncludeAllCollections","onToggleIncludeMedia","phase","preview","selected","mediaGroupIncluded","hasMediaBlobOption","Boolean","mediaBlobCandidates","inner","div","aria-live","className","p","buttonStyle","onClick","size","groups","length","label","input","aria-label","checked","onChange","type","span","ul","map","g","mainDocs","main","docCount","versionDocs","versions","totalDocs","li","displayTitle","groupId","adminPills","adminHiddenReasons","isMedia","t"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const ManualBackupDialog: React.FC;