@plutonhq/core-frontend 0.1.30 → 0.1.32

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 (61) hide show
  1. package/dist-lib/@types/devices.d.ts +4 -4
  2. package/dist-lib/@types/devices.d.ts.map +1 -1
  3. package/dist-lib/@types/plans.d.ts +1 -0
  4. package/dist-lib/@types/plans.d.ts.map +1 -1
  5. package/dist-lib/components/App/Footer/Footer.d.ts +2 -1
  6. package/dist-lib/components/App/Footer/Footer.d.ts.map +1 -1
  7. package/dist-lib/components/App/Footer/Footer.js +10 -8
  8. package/dist-lib/components/App/Footer/Footer.js.map +1 -1
  9. package/dist-lib/components/Device/EditDevice/EditDevice.d.ts.map +1 -1
  10. package/dist-lib/components/Device/EditDevice/EditDevice.js +70 -61
  11. package/dist-lib/components/Device/EditDevice/EditDevice.js.map +1 -1
  12. package/dist-lib/components/Plan/BackupEvents/BackupEvents.js +33 -33
  13. package/dist-lib/components/Plan/BackupEvents/BackupEvents.js.map +1 -1
  14. package/dist-lib/components/Plan/BackupEvents/BackupEvents.module.scss.js +36 -36
  15. package/dist-lib/components/Plan/BackupProgress/BackupProgress.d.ts.map +1 -1
  16. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +79 -72
  17. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
  18. package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js +27 -25
  19. package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js.map +1 -1
  20. package/dist-lib/components/Plan/Backups/Backups.d.ts.map +1 -1
  21. package/dist-lib/components/Plan/Backups/Backups.js +148 -144
  22. package/dist-lib/components/Plan/Backups/Backups.js.map +1 -1
  23. package/dist-lib/components/Plan/Backups/Backups.module.scss.js +34 -32
  24. package/dist-lib/components/Plan/Backups/Backups.module.scss.js.map +1 -1
  25. package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.d.ts.map +1 -1
  26. package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.js +89 -101
  27. package/dist-lib/components/Plan/PlanSettings/PlanScriptsSettings.js.map +1 -1
  28. package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.d.ts.map +1 -1
  29. package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js +31 -25
  30. package/dist-lib/components/Plan/PlanSettings/PlanSourceSettings.js.map +1 -1
  31. package/dist-lib/components/common/form/StoragePicker/StoragePicker.d.ts.map +1 -1
  32. package/dist-lib/components/common/form/StoragePicker/StoragePicker.js +52 -46
  33. package/dist-lib/components/common/form/StoragePicker/StoragePicker.js.map +1 -1
  34. package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
  35. package/dist-lib/routes/PlanSingle/PlanSingle.js +76 -72
  36. package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
  37. package/dist-lib/routes/PlanSingle/PlanSingle.module.scss.js +14 -12
  38. package/dist-lib/routes/PlanSingle/PlanSingle.module.scss.js.map +1 -1
  39. package/dist-lib/styles/core-frontend.css +1 -1
  40. package/dist-lib/styles/global.scss +4 -0
  41. package/dist-lib/utils/progressHelpers.d.ts.map +1 -1
  42. package/dist-lib/utils/progressHelpers.js +1 -0
  43. package/dist-lib/utils/progressHelpers.js.map +1 -1
  44. package/package.json +1 -1
  45. package/src/@types/devices.ts +4 -4
  46. package/src/@types/plans.ts +1 -0
  47. package/src/components/App/Footer/Footer.tsx +3 -2
  48. package/src/components/Device/EditDevice/EditDevice.tsx +11 -4
  49. package/src/components/Plan/BackupEvents/BackupEvents.module.scss +2 -0
  50. package/src/components/Plan/BackupEvents/BackupEvents.tsx +2 -2
  51. package/src/components/Plan/BackupProgress/BackupProgress.module.scss +4 -0
  52. package/src/components/Plan/BackupProgress/BackupProgress.tsx +11 -4
  53. package/src/components/Plan/Backups/Backups.module.scss +16 -0
  54. package/src/components/Plan/Backups/Backups.tsx +13 -2
  55. package/src/components/Plan/PlanSettings/PlanScriptsSettings.tsx +29 -31
  56. package/src/components/Plan/PlanSettings/PlanSourceSettings.tsx +11 -3
  57. package/src/components/common/form/StoragePicker/StoragePicker.tsx +10 -2
  58. package/src/routes/PlanSingle/PlanSingle.module.scss +10 -0
  59. package/src/routes/PlanSingle/PlanSingle.tsx +6 -1
  60. package/src/styles/global.scss +4 -0
  61. package/src/utils/progressHelpers.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"BackupEvents.js","sources":["../../../../src/components/Plan/BackupEvents/BackupEvents.tsx"],"sourcesContent":["import Icon from '../../common/Icon/Icon';\r\nimport SidePanel from '../../common/SidePanel/SidePanel';\r\nimport { getBackupEventActionMessage, getRestoreEventActionMessage } from '../../../utils/progressHelpers';\r\nimport classes from './BackupEvents.module.scss';\r\nimport { BackupProgressData, ReplicationProgressData } from '../../../@types/backups';\r\nimport { useGetBackupProgressOnce } from '../../../services/backups';\r\nimport { useGetRestoreProgressOnce } from '../../../services/restores';\r\nimport { useMemo, useState } from 'react';\r\nimport Modal from '../../common/Modal/Modal';\r\nimport { formatDuration } from '../../../utils/helpers';\r\n\r\ninterface BackupEventsProps {\r\n id: string;\r\n planId: string;\r\n sourceId: string;\r\n sourceType: string;\r\n type?: 'backup' | 'restore';\r\n inProgress?: boolean;\r\n progressData?: BackupProgressData | null;\r\n close: () => void;\r\n}\r\n\r\nconst BackupEvents = ({ id, type = 'backup', sourceId, sourceType, planId, inProgress, progressData, close }: BackupEventsProps) => {\r\n const [showError, setShowError] = useState<false | string>(false);\r\n const { data: fetchedProgressData, isLoading } =\r\n type === 'backup'\r\n ? useGetBackupProgressOnce({ id, sourceId, sourceType, planId })\r\n : useGetRestoreProgressOnce({ id, sourceId, sourceType, planId });\r\n\r\n const progressDataToUse: BackupProgressData | null = progressData || fetchedProgressData;\r\n\r\n console.log('progressDataToUse :', progressDataToUse);\r\n const hasFinished = useMemo(() => {\r\n if (!progressDataToUse || !progressDataToUse.events) return '';\r\n let finishedEvent = '';\r\n progressDataToUse.events.forEach((event) => {\r\n if (event.action === 'TASK_COMPLETED') {\r\n finishedEvent = 'Completed';\r\n } else if (event.action === 'TASK_CANCELLED') {\r\n finishedEvent = 'Cancelled';\r\n } else if (event.action === 'FAILED_PERMANENTLY') {\r\n finishedEvent = 'Failed';\r\n }\r\n });\r\n return finishedEvent;\r\n }, [progressDataToUse]);\r\n\r\n return (\r\n <SidePanel title={`${type}-${id} Events`} width=\"1000px\" icon={<Icon type={'logs'} size={18} />} footer={<></>} close={close}>\r\n <div className={classes.backupEventsContainer}>\r\n <div className={classes.header}>\r\n <div\r\n title=\"Status\"\r\n className={`${classes.status} ${inProgress ? classes.inProgress : ''} \r\n ${!inProgress && hasFinished === 'Completed' ? classes.hasCompleted : ''} ${!inProgress && hasFinished === 'Failed' ? classes.hasFailed : ''}`}\r\n >\r\n <Icon type={inProgress ? 'loading' : hasFinished === 'Completed' ? 'check-circle-filled' : 'error-circle-filled'} size={14} />{' '}\r\n {inProgress ? `${type} In Progress` : `${type} ${hasFinished}` || 'Unknown'}\r\n </div>\r\n {!inProgress && hasFinished && (\r\n <div title=\"Duration\" className={classes.duration}>\r\n <Icon type=\"clock\" size={14} /> {(progressDataToUse?.duration && formatDuration(progressDataToUse.duration / 1000)) || 'N/A'}\r\n </div>\r\n )}\r\n </div>\r\n {isLoading && (\r\n <div className={classes.loading}>\r\n <Icon type={'loading'} size={30} />\r\n </div>\r\n )}\r\n {progressDataToUse && progressDataToUse.events && progressDataToUse.events.length > 0 ? (\r\n <ul className={classes.eventList}>\r\n {progressDataToUse.events.map((event: any, index: number) => {\r\n const completed = event.phase === 'finished' && event.action === 'TASK_COMPLETED';\r\n const failed = event.phase === 'finished' && event.action === 'FAILED_PERMANENTLY';\r\n const retrying = event.action.includes('RETRY_ATTEMPT_');\r\n const isError = event.action === 'TASK_FAILED';\r\n const isWarning =\r\n event.action === 'BACKUP_WARNING' ||\r\n event.action === 'RESTORE_WARNING' ||\r\n event.action === 'POST_BACKUP_PRUNE_FAILED' ||\r\n event.action === 'POST_BACKUP_REPO_STATS_FAILED';\r\n return (\r\n <li\r\n key={index}\r\n className={`${classes.eventItem} ${event.error ? classes.error : ''} \r\n ${completed ? classes.completed : ''} ${failed ? classes.failed : ''} \r\n ${retrying ? classes.retrying : ''} ${isError ? classes.isError : ''} \r\n ${isWarning ? classes.isWarning : ''}`}\r\n >\r\n <span className={classes.icon}>\r\n <Icon type={event.error || isWarning ? 'error-circle-filled' : 'check-circle-filled'} size={16} />\r\n </span>\r\n {/* Timestamp should be converted to time only eg: 10:20:23 AM */}\r\n <span className={classes.time}>{new Date(event.timestamp).toLocaleTimeString()}</span>\r\n <span className={classes.phase}>{event.phase}</span>\r\n <span className={classes.action}>\r\n {type === 'backup' ? getBackupEventActionMessage(event.action) : getRestoreEventActionMessage(event.action)}\r\n {event.error && (\r\n <span className={classes.viewError} onClick={() => setShowError(`main-${index}`)}>\r\n View Error\r\n </span>\r\n )}\r\n </span>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n ) : null}\r\n {/* Mirror Events */}\r\n {progressDataToUse?.mirrors && Object.keys(progressDataToUse.mirrors).length > 0 && (\r\n <div className={classes.mirrorsEventsSection}>\r\n {Object.entries(progressDataToUse.mirrors as Record<string, ReplicationProgressData>).map(([storageId, mirror]) => (\r\n <div key={storageId} className={classes.mirrorEventsGroup}>\r\n <div className={classes.mirrorEventsHeader}>\r\n <img src={`/providers/${mirror.storageType}.png`} className={classes.mirrorProviderIcon} />\r\n <span className={classes.mirrorEventsName}>{mirror.storageName}</span>\r\n <span className={`${classes.mirrorEventsStatus} ${classes[`mirror_${mirror.status}`] || ''}`}>{mirror.status}</span>\r\n </div>\r\n {mirror.events && mirror.events.length > 0 ? (\r\n <ul className={classes.eventList}>\r\n {mirror.events.map((event: any, index: number) => {\r\n const isError = event.error;\r\n const isCompleted = event.action === 'REPLICATION_COMPLETE';\r\n const isFailed = event.action === 'REPLICATION_FAILED';\r\n return (\r\n <li\r\n key={index}\r\n className={`${classes.eventItem} ${isError ? classes.error : ''} ${isCompleted ? classes.completed : ''} ${isFailed ? classes.failed : ''}`}\r\n >\r\n <span className={classes.icon}>\r\n <Icon type={isError ? 'error-circle-filled' : 'check-circle-filled'} size={16} />\r\n </span>\r\n <span className={classes.time}>{new Date(event.timestamp).toLocaleTimeString()}</span>\r\n <span className={classes.phase}>{event.phase}</span>\r\n <span className={classes.action}>\r\n {getBackupEventActionMessage(event.action, mirror.storageName)}\r\n {event.error && (\r\n <span className={classes.viewError} onClick={() => setShowError(`mirror-${storageId}-${index}`)}>\r\n View Error\r\n </span>\r\n )}\r\n </span>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n ) : (\r\n <div className={classes.noEvents}>No events recorded</div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n {showError && (\r\n <Modal title=\"Error Details\" closeModal={() => setShowError(false)} width=\"400px\">\r\n <div className={classes.errorDetails}>\r\n {(() => {\r\n if (typeof showError === 'string') {\r\n if (showError.startsWith('main-')) {\r\n const idx = parseInt(showError.replace('main-', ''));\r\n return progressDataToUse?.events[idx]?.error || 'Unknown error occurred.';\r\n }\r\n if (showError.startsWith('mirror-')) {\r\n const parts = showError.replace('mirror-', '').split('-');\r\n const eventIdx = parseInt(parts.pop()!);\r\n const sId = parts.join('-');\r\n return (progressDataToUse?.mirrors as any)?.[sId]?.events?.[eventIdx]?.error || 'Unknown error occurred.';\r\n }\r\n }\r\n return 'Unknown error occurred.';\r\n })()}\r\n </div>\r\n </Modal>\r\n )}\r\n </SidePanel>\r\n );\r\n};\r\n\r\nexport default BackupEvents;\r\n"],"names":["BackupEvents","id","type","sourceId","sourceType","planId","inProgress","progressData","close","showError","setShowError","useState","fetchedProgressData","isLoading","useGetBackupProgressOnce","useGetRestoreProgressOnce","progressDataToUse","hasFinished","useMemo","finishedEvent","event","jsxs","SidePanel","jsx","Icon","Fragment","classes","formatDuration","index","completed","failed","retrying","isError","isWarning","getBackupEventActionMessage","getRestoreEventActionMessage","storageId","mirror","isCompleted","isFailed","Modal","idx","_a","parts","eventIdx","sId","_e","_d","_c","_b"],"mappings":"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"}
1
+ {"version":3,"file":"BackupEvents.js","sources":["../../../../src/components/Plan/BackupEvents/BackupEvents.tsx"],"sourcesContent":["import Icon from '../../common/Icon/Icon';\r\nimport SidePanel from '../../common/SidePanel/SidePanel';\r\nimport { getBackupEventActionMessage, getRestoreEventActionMessage } from '../../../utils/progressHelpers';\r\nimport classes from './BackupEvents.module.scss';\r\nimport { BackupProgressData, ReplicationProgressData } from '../../../@types/backups';\r\nimport { useGetBackupProgressOnce } from '../../../services/backups';\r\nimport { useGetRestoreProgressOnce } from '../../../services/restores';\r\nimport { useMemo, useState } from 'react';\r\nimport Modal from '../../common/Modal/Modal';\r\nimport { formatDuration } from '../../../utils/helpers';\r\n\r\ninterface BackupEventsProps {\r\n id: string;\r\n planId: string;\r\n sourceId: string;\r\n sourceType: string;\r\n type?: 'backup' | 'restore';\r\n inProgress?: boolean;\r\n progressData?: BackupProgressData | null;\r\n close: () => void;\r\n}\r\n\r\nconst BackupEvents = ({ id, type = 'backup', sourceId, sourceType, planId, inProgress, progressData, close }: BackupEventsProps) => {\r\n const [showError, setShowError] = useState<false | string>(false);\r\n const { data: fetchedProgressData, isLoading } =\r\n type === 'backup'\r\n ? useGetBackupProgressOnce({ id, sourceId, sourceType, planId })\r\n : useGetRestoreProgressOnce({ id, sourceId, sourceType, planId });\r\n\r\n const progressDataToUse: BackupProgressData | null = progressData || fetchedProgressData;\r\n\r\n console.log('progressDataToUse :', progressDataToUse);\r\n const hasFinished = useMemo(() => {\r\n if (!progressDataToUse || !progressDataToUse.events) return '';\r\n let finishedEvent = '';\r\n progressDataToUse.events.forEach((event) => {\r\n if (event.action === 'TASK_COMPLETED') {\r\n finishedEvent = 'Completed';\r\n } else if (event.action === 'TASK_CANCELLED') {\r\n finishedEvent = 'Cancelled';\r\n } else if (event.action === 'FAILED_PERMANENTLY') {\r\n finishedEvent = 'Failed';\r\n }\r\n });\r\n return finishedEvent;\r\n }, [progressDataToUse]);\r\n\r\n return (\r\n <SidePanel title={`${type}-${id} Events`} width=\"1000px\" icon={<Icon type={'logs'} size={18} />} footer={<></>} close={close}>\r\n <div className={classes.backupEventsContainer}>\r\n <div className={classes.header}>\r\n <div\r\n title=\"Status\"\r\n className={`${classes.status} ${inProgress ? classes.inProgress : ''} \r\n ${!inProgress && hasFinished === 'Completed' ? classes.hasCompleted : ''} ${!inProgress && hasFinished === 'Failed' ? classes.hasFailed : ''}`}\r\n >\r\n <Icon type={inProgress ? 'loading' : hasFinished === 'Completed' ? 'check-circle-filled' : 'error-circle-filled'} size={14} />{' '}\r\n {inProgress ? `${type} In Progress` : `${type} ${hasFinished}` || 'Unknown'}\r\n </div>\r\n {!inProgress && hasFinished && (\r\n <div title=\"Duration\" className={classes.duration}>\r\n <Icon type=\"clock\" size={14} /> {(progressDataToUse?.duration && formatDuration(progressDataToUse.duration / 1000)) || 'N/A'}\r\n </div>\r\n )}\r\n </div>\r\n {isLoading && (\r\n <div className={classes.loading}>\r\n <Icon type={'loading'} size={30} />\r\n </div>\r\n )}\r\n {progressDataToUse && progressDataToUse.events && progressDataToUse.events.length > 0 ? (\r\n <ul className={classes.eventList}>\r\n {progressDataToUse.events.map((event: any, index: number) => {\r\n const completed = event.phase === 'finished' && event.action === 'TASK_COMPLETED';\r\n const failed = event.phase === 'finished' && event.action === 'FAILED_PERMANENTLY';\r\n const retrying = event.action.includes('RETRY_ATTEMPT_');\r\n const isError = event.action === 'TASK_FAILED';\r\n const isWarning =\r\n event.action === 'BACKUP_WARNING' ||\r\n event.action === 'RESTORE_WARNING' ||\r\n event.action === 'POST_BACKUP_PRUNE_FAILED' ||\r\n event.action === 'POST_BACKUP_REPO_STATS_FAILED';\r\n return (\r\n <li\r\n key={index}\r\n className={`${classes.eventItem} ${event.error ? classes.error : ''} \r\n ${completed ? classes.completed : ''} ${failed ? classes.failed : ''} \r\n ${retrying ? classes.retrying : ''} ${isError ? classes.isError : ''} \r\n ${isWarning ? classes.isWarning : ''}`}\r\n >\r\n <span className={classes.icon}>\r\n <Icon type={event.error || isWarning ? 'error-circle-filled' : 'check-circle-filled'} size={16} />\r\n </span>\r\n {/* Timestamp should be converted to time only eg: 10:20:23 AM */}\r\n <span className={classes.time}>{new Date(event.timestamp).toLocaleTimeString()}</span>\r\n <span className={classes.phase}>{event.phase}</span>\r\n <span className={classes.action}>\r\n {type === 'backup' ? getBackupEventActionMessage(event.action) : getRestoreEventActionMessage(event.action)}\r\n {event.error && (\r\n <span className={classes.viewError} onClick={() => setShowError(`main-${index}`)}>\r\n View Error\r\n </span>\r\n )}\r\n </span>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n ) : null}\r\n {/* Mirror Events */}\r\n {progressDataToUse?.mirrors && Object.keys(progressDataToUse.mirrors).length > 0 && (\r\n <div className={classes.mirrorsEventsSection}>\r\n {Object.entries(progressDataToUse.mirrors as Record<string, ReplicationProgressData>).map(([storageId, mirror]) => (\r\n <div key={storageId} className={classes.mirrorEventsGroup}>\r\n <div className={classes.mirrorEventsHeader}>\r\n <img src={`/providers/${mirror.storageType}.png`} className={classes.mirrorProviderIcon} />\r\n <span className={classes.mirrorEventsName}>{mirror.storageName}</span>\r\n <span className={`${classes.mirrorEventsStatus} ${classes[`mirror_${mirror.status}`] || ''}`}>{mirror.status}</span>\r\n </div>\r\n {mirror.events && mirror.events.length > 0 ? (\r\n <ul className={classes.eventList}>\r\n {mirror.events.map((event: any, index: number) => {\r\n const isError = event.error;\r\n const isCompleted = event.action === 'REPLICATION_COMPLETE';\r\n const isFailed = event.action === 'REPLICATION_FAILED';\r\n return (\r\n <li\r\n key={index}\r\n className={`${classes.eventItem} ${isError ? classes.error : ''} ${isCompleted ? classes.completed : ''} ${isFailed ? classes.failed : ''}`}\r\n >\r\n <span className={classes.icon}>\r\n <Icon type={isError ? 'error-circle-filled' : 'check-circle-filled'} size={16} />\r\n </span>\r\n <span className={classes.time}>{new Date(event.timestamp).toLocaleTimeString()}</span>\r\n <span className={classes.phase}>{event.phase}</span>\r\n <span className={classes.action}>\r\n {getBackupEventActionMessage(event.action, mirror.storageName)}\r\n {event.error && (\r\n <span className={classes.viewError} onClick={() => setShowError(`mirror-${storageId}-${index}`)}>\r\n View Error\r\n </span>\r\n )}\r\n </span>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n ) : (\r\n <div className={classes.noEvents}>No events recorded</div>\r\n )}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n {showError && (\r\n <Modal title=\"Error Details\" closeModal={() => setShowError(false)} width={'400px'}>\r\n <div className={classes.errorDetails} data-length={showError.length}>\r\n {(() => {\r\n if (typeof showError === 'string') {\r\n if (showError.startsWith('main-')) {\r\n const idx = parseInt(showError.replace('main-', ''));\r\n return progressDataToUse?.events[idx]?.error || 'Unknown error occurred.';\r\n }\r\n if (showError.startsWith('mirror-')) {\r\n const parts = showError.replace('mirror-', '').split('-');\r\n const eventIdx = parseInt(parts.pop()!);\r\n const sId = parts.join('-');\r\n return (progressDataToUse?.mirrors as any)?.[sId]?.events?.[eventIdx]?.error || 'Unknown error occurred.';\r\n }\r\n }\r\n return 'Unknown error occurred.';\r\n })()}\r\n </div>\r\n </Modal>\r\n )}\r\n </SidePanel>\r\n );\r\n};\r\n\r\nexport default BackupEvents;\r\n"],"names":["BackupEvents","id","type","sourceId","sourceType","planId","inProgress","progressData","close","showError","setShowError","useState","fetchedProgressData","isLoading","useGetBackupProgressOnce","useGetRestoreProgressOnce","progressDataToUse","hasFinished","useMemo","finishedEvent","event","jsxs","SidePanel","jsx","Icon","Fragment","classes","formatDuration","index","completed","failed","retrying","isError","isWarning","getBackupEventActionMessage","getRestoreEventActionMessage","storageId","mirror","isCompleted","isFailed","Modal","idx","_a","parts","eventIdx","sId","_e","_d","_c","_b"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- const r = "_backupEventsContainer_n4dRx", o = "_header_gwZmX", n = "_duration_g6SJ5", e = "_status_KCVYI", t = "_inProgress_xqRZ6", i = "_hasCompleted_l14Zh", s = "_hasFailed_8Em4T", _ = "_loading_G2evI", m = "_eventList_i0U7P", a = "_eventItem_QNqCj", c = "_time_B3ExX", d = "_phase_39yB7", l = "_action_2yQJt", v = "_viewError_yTsK2", E = "_icon_BkVDZ", p = "_error_DGh2a", g = "_completed_XASOL", u = "_failed_zC3W6", h = "_retrying_ICrjq", C = "_isError_tkQGd", I = "_isWarning_yUW3h", P = "_mirrorsEventsSection_wafxu", f = "_mirrorEventsGroup_IQEqQ", y = "_mirrorEventsHeader_ltIUG", Q = "_mirrorProviderIcon_Uk5Aj", S = "_mirrorEventsName_lHe4o", x = "_mirrorEventsStatus_Lj60w", G = "_mirror_pending_5MiPJ", W = "_mirror_pending_5MiPJ", k = "_mirror_running_QXWpO", w = "_mirror_running_QXWpO", F = "_mirror_completed_n0Hum", H = "_mirror_completed_n0Hum", N = "_mirror_failed_6xzTN", D = "_mirror_failed_6xzTN", L = "_noEvents_UyosQ", U = "_errorDetails_4Yb0F", X = {
1
+ const r = "_backupEventsContainer_9dH1T", o = "_header_Kxhdm", n = "_duration_1aCfh", e = "_status_yfu37", t = "_inProgress_jxlZv", i = "_hasCompleted_M9PAG", s = "_hasFailed_6WjH2", _ = "_loading_YMZCQ", m = "_eventList_ybfpu", a = "_eventItem_btgx0", c = "_time_ydcC7", d = "_phase_XEe5Q", l = "_action_vUkfm", v = "_viewError_RyzV5", E = "_icon_qbCwk", p = "_error_l3WwG", g = "_completed_WSzoQ", u = "_failed_CwSxD", h = "_retrying_KEtnS", f = "_isError_KroqN", C = "_isWarning_5xegh", w = "_mirrorsEventsSection_EoE5l", x = "_mirrorEventsGroup_IFWxA", I = "_mirrorEventsHeader_La9MM", F = "_mirrorProviderIcon_hE4ok", P = "_mirrorEventsName_Z129E", S = "_mirrorEventsStatus_FKJEw", k = "_mirror_pending_dnxIF", y = "_mirror_pending_dnxIF", W = "_mirror_running_MAIOw", b = "_mirror_running_MAIOw", A = "_mirror_completed_UAaNT", M = "_mirror_completed_UAaNT", N = "_mirror_failed_zOixw", G = "_mirror_failed_zOixw", H = "_noEvents_1fkoX", z = "_errorDetails_qRpc4", D = {
2
2
  backupEventsContainer: r,
3
3
  header: o,
4
4
  duration: n,
@@ -18,33 +18,33 @@ const r = "_backupEventsContainer_n4dRx", o = "_header_gwZmX", n = "_duration_g6
18
18
  completed: g,
19
19
  failed: u,
20
20
  retrying: h,
21
- isError: C,
22
- isWarning: I,
23
- mirrorsEventsSection: P,
24
- mirrorEventsGroup: f,
25
- mirrorEventsHeader: y,
26
- mirrorProviderIcon: Q,
27
- mirrorEventsName: S,
28
- mirrorEventsStatus: x,
29
- mirror_pending: G,
30
- mirrorPending: W,
31
- mirror_running: k,
32
- mirrorRunning: w,
33
- mirror_completed: F,
34
- mirrorCompleted: H,
21
+ isError: f,
22
+ isWarning: C,
23
+ mirrorsEventsSection: w,
24
+ mirrorEventsGroup: x,
25
+ mirrorEventsHeader: I,
26
+ mirrorProviderIcon: F,
27
+ mirrorEventsName: P,
28
+ mirrorEventsStatus: S,
29
+ mirror_pending: k,
30
+ mirrorPending: y,
31
+ mirror_running: W,
32
+ mirrorRunning: b,
33
+ mirror_completed: A,
34
+ mirrorCompleted: M,
35
35
  mirror_failed: N,
36
- mirrorFailed: D,
37
- noEvents: L,
38
- errorDetails: U
36
+ mirrorFailed: G,
37
+ noEvents: H,
38
+ errorDetails: z
39
39
  };
40
40
  export {
41
41
  l as action,
42
42
  r as backupEventsContainer,
43
43
  g as completed,
44
- X as default,
44
+ D as default,
45
45
  n as duration,
46
46
  p as error,
47
- U as errorDetails,
47
+ z as errorDetails,
48
48
  a as eventItem,
49
49
  m as eventList,
50
50
  u as failed,
@@ -53,24 +53,24 @@ export {
53
53
  o as header,
54
54
  E as icon,
55
55
  t as inProgress,
56
- C as isError,
57
- I as isWarning,
56
+ f as isError,
57
+ C as isWarning,
58
58
  _ as loading,
59
- H as mirrorCompleted,
60
- f as mirrorEventsGroup,
61
- y as mirrorEventsHeader,
62
- S as mirrorEventsName,
63
- x as mirrorEventsStatus,
64
- D as mirrorFailed,
65
- W as mirrorPending,
66
- Q as mirrorProviderIcon,
67
- w as mirrorRunning,
68
- F as mirror_completed,
59
+ M as mirrorCompleted,
60
+ x as mirrorEventsGroup,
61
+ I as mirrorEventsHeader,
62
+ P as mirrorEventsName,
63
+ S as mirrorEventsStatus,
64
+ G as mirrorFailed,
65
+ y as mirrorPending,
66
+ F as mirrorProviderIcon,
67
+ b as mirrorRunning,
68
+ A as mirror_completed,
69
69
  N as mirror_failed,
70
- G as mirror_pending,
71
- k as mirror_running,
72
- P as mirrorsEventsSection,
73
- L as noEvents,
70
+ k as mirror_pending,
71
+ W as mirror_running,
72
+ w as mirrorsEventsSection,
73
+ H as noEvents,
74
74
  d as phase,
75
75
  h as retrying,
76
76
  e as status,
@@ -1 +1 @@
1
- {"version":3,"file":"BackupProgress.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/BackupProgress/BackupProgress.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAMvD,UAAU,mBAAmB;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC7B;AAED,QAAA,MAAM,cAAc,GAAI,8CAAyD,mBAAmB,4CAoQnG,CAAC;AACF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"BackupProgress.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/BackupProgress/BackupProgress.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAMvD,UAAU,mBAAmB;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC7B;AAED,QAAA,MAAM,cAAc,GAAI,8CAAyD,mBAAmB,4CA2QnG,CAAC;AACF,eAAe,cAAc,CAAC"}
@@ -1,32 +1,30 @@
1
- import { jsxs as r, jsx as t, Fragment as C } from "react/jsx-runtime";
2
- import { useState as E } from "react";
3
- import { useQueryClient as J } from "@tanstack/react-query";
4
- import { toast as j } from "react-toastify";
1
+ import { jsxs as r, jsx as t, Fragment as R } from "react/jsx-runtime";
2
+ import { useState as x } from "react";
3
+ import { useQueryClient as W } from "@tanstack/react-query";
4
+ import { toast as O } from "react-toastify";
5
5
  import d from "../../common/Icon/Icon.js";
6
- import { useCancelBackup as V, useGetBackupProgress as W } from "../../../services/backups.js";
6
+ import { useCancelBackup as X, useGetBackupProgress as Z } from "../../../services/backups.js";
7
7
  import e from "./BackupProgress.module.scss.js";
8
- import { timeAgo as X, formatDateTime as Z, formatBytes as L, formatSeconds as D } from "../../../utils/helpers.js";
9
- import { extractResticData as ee, generateBackupProgressMessage as se, generateRestoreProgressMessage as re, generateMirrorProgressMessage as te } from "../../../utils/progressHelpers.js";
10
- import ne from "../../common/ActionModal/ActionModal.js";
11
- import { useCancelRestore as oe, useGetRestoreProgress as ae } from "../../../services/restores.js";
12
- import ie from "../BackupEvents/BackupEvents.js";
13
- const ye = ({ item: l, sourceId: k, sourceType: v, planId: c, type: o = "backup" }) => {
14
- const [O, R] = E(!1), [Q, S] = E(!1), $ = J(), B = oe(), w = V(), { id: g, started: y } = l, { data: a } = o === "backup" ? W({ id: g, sourceId: k, sourceType: v, planId: c }) : ae({ id: g, sourceId: k, sourceType: v, planId: c });
15
- console.log("#### data :", a);
16
- const s = ee(a), G = o === "backup" ? se(a) : re(a), {
17
- total_files_processed: I = (s == null ? void 0 : s.total_files) || 0,
18
- files_done: K = 0,
19
- total_bytes_processed: N = (s == null ? void 0 : s.total_bytes_processed) || (s == null ? void 0 : s.total_bytes) || 0,
8
+ import { timeAgo as D, formatDateTime as ee, formatBytes as j, formatSeconds as se } from "../../../utils/helpers.js";
9
+ import { extractResticData as re, generateBackupProgressMessage as te, generateRestoreProgressMessage as ne, generateMirrorProgressMessage as ie } from "../../../utils/progressHelpers.js";
10
+ import oe from "../../common/ActionModal/ActionModal.js";
11
+ import { useCancelRestore as ae, useGetRestoreProgress as le } from "../../../services/restores.js";
12
+ import ce from "../BackupEvents/BackupEvents.js";
13
+ const _e = ({ item: l, sourceId: b, sourceType: v, planId: c, type: i = "backup" }) => {
14
+ const [I, S] = x(!1), [K, y] = x(!1), $ = W(), B = ae(), w = X(), { id: g, started: N } = l, { data: o } = i === "backup" ? Z({ id: g, sourceId: b, sourceType: v, planId: c }) : le({ id: g, sourceId: b, sourceType: v, planId: c }), s = re(o), L = i === "backup" ? te(o) : ne(o), Q = o == null ? void 0 : o.events.find((a) => a.action === "BACKUP_OPERATION_START" && a.resticData), U = i === "backup" && !Q, {
15
+ total_files_processed: G = (s == null ? void 0 : s.total_files) || 0,
16
+ files_done: Y = 0,
17
+ total_bytes_processed: _ = (s == null ? void 0 : s.total_bytes_processed) || (s == null ? void 0 : s.total_bytes) || 0,
20
18
  bytes_done: F = 0,
21
- bytes_restored: z = 0,
22
- files_restored: A = 0,
23
- seconds_remaining: U = 0,
24
- percent_done: _ = 0
19
+ bytes_restored: A = 0,
20
+ files_restored: T = 0,
21
+ seconds_remaining: H = 0,
22
+ percent_done: P = 0
25
23
  } = s || {};
26
- let h = K, f = F, P = N, T = I, u = N ? Math.round(F / N * 100) : 0;
27
- o === "restore" && (u = Math.round(_ * 100), s != null && s.total_bytes && (P = s.total_bytes), z ? f = z : s != null && s.total_bytes && (f = Math.round(_ * s.total_bytes)), A ? h = A : s != null && s.total_files && (h = Math.round(_ * s.total_files))), (s == null ? void 0 : s.message_type) === "summary" && (u = 100, h = T, f = P);
28
- const Y = () => {
29
- console.log("cancel :", o, l), o === "backup" ? j.promise(
24
+ let h = Y, f = F, C = _, z = G, m = _ ? Math.round(F / _ * 100) : 0;
25
+ i === "restore" && (m = Math.round(P * 100), s != null && s.total_bytes && (C = s.total_bytes), A ? f = A : s != null && s.total_bytes && (f = Math.round(P * s.total_bytes)), T ? h = T : s != null && s.total_files && (h = Math.round(P * s.total_files))), (s == null ? void 0 : s.message_type) === "summary" && (m = 100, h = z, f = C);
26
+ const J = () => {
27
+ console.log("cancel :", i, l), i === "backup" ? O.promise(
30
28
  w.mutateAsync(
31
29
  { planId: c, backupId: l.id },
32
30
  {
@@ -37,12 +35,12 @@ const ye = ({ item: l, sourceId: k, sourceType: v, planId: c, type: o = "backup"
37
35
  pending: "Sending Cancel Request...",
38
36
  success: "Backup process Cancelled!",
39
37
  error: {
40
- render({ data: i }) {
41
- return `Failed to cancel backup process. ${(i == null ? void 0 : i.message) || "Unknown Error."}`;
38
+ render({ data: a }) {
39
+ return `Failed to cancel backup process. ${(a == null ? void 0 : a.message) || "Unknown Error."}`;
42
40
  }
43
41
  }
44
42
  }
45
- ) : j.promise(
43
+ ) : O.promise(
46
44
  B.mutateAsync(
47
45
  { planId: c, restoreId: l.id },
48
46
  {
@@ -53,8 +51,8 @@ const ye = ({ item: l, sourceId: k, sourceType: v, planId: c, type: o = "backup"
53
51
  pending: "Sending Cancel Request...",
54
52
  success: "Restore process Cancelled!",
55
53
  error: {
56
- render({ data: i }) {
57
- return `Failed to cancel restore process. ${(i == null ? void 0 : i.message) || "Unknown Error."}`;
54
+ render({ data: a }) {
55
+ return `Failed to cancel restore process. ${(a == null ? void 0 : a.message) || "Unknown Error."}`;
58
56
  }
59
57
  }
60
58
  }
@@ -65,28 +63,37 @@ const ye = ({ item: l, sourceId: k, sourceType: v, planId: c, type: o = "backup"
65
63
  /* @__PURE__ */ t("div", { className: e.backupIcon, children: /* @__PURE__ */ t(d, { type: "loading", size: 24 }) }),
66
64
  /* @__PURE__ */ r("div", { className: e.backupLeft, children: [
67
65
  /* @__PURE__ */ r("div", { className: e.backupId, children: [
68
- o === "restore" ? "Restoring " : "",
66
+ i === "restore" ? "Restoring " : "",
69
67
  "backup-",
70
68
  g,
71
- /* @__PURE__ */ r("span", { className: e.backupTime, title: Z(y), children: [
69
+ /* @__PURE__ */ r("span", { className: e.backupTime, title: ee(N), children: [
72
70
  /* @__PURE__ */ t(d, { type: "clock", size: 12 }),
73
71
  " Started ",
74
- y ? X(new Date(y)) : "a few seconds ago"
72
+ N ? D(new Date(N)) : "a few seconds ago"
75
73
  ] }),
76
74
  l.errorMsg && /* @__PURE__ */ r("span", { className: e.backupError, children: [
77
75
  /* @__PURE__ */ t(d, { type: "error-circle-filled", size: 13 }),
78
76
  " ",
79
- /* @__PURE__ */ r("i", { "data-tooltip-id": "htmlToolTip", "data-tooltip-place": "top", "data-tooltip-html": l.errorMsg, children: [
80
- /* @__PURE__ */ t("u", { children: "Error" }),
81
- " Occurred."
82
- ] }),
77
+ /* @__PURE__ */ r(
78
+ "i",
79
+ {
80
+ "data-tooltip-id": "htmlToolTip",
81
+ "data-tooltip-place": "top",
82
+ "data-tooltip-html": `<div class="linebreak-tooltip-content">${l.errorMsg.slice(0, 120) + (l.errorMsg.length > 120 ? "..." : "")}</div>`,
83
+ onClick: () => y(!0),
84
+ children: [
85
+ /* @__PURE__ */ t("u", { children: "Error" }),
86
+ " Occurred."
87
+ ]
88
+ }
89
+ ),
83
90
  " ",
84
91
  "Retrying..."
85
92
  ] })
86
93
  ] }),
87
94
  /* @__PURE__ */ r("div", { className: e.backupStart, children: [
88
- /* @__PURE__ */ t("div", { children: /* @__PURE__ */ t("span", { className: e.progressMessage, onClick: () => S(!0), children: G }) }),
89
- /* @__PURE__ */ r("button", { onClick: () => R(!0), title: `Cancel ${o}`, children: [
95
+ /* @__PURE__ */ t("div", { children: /* @__PURE__ */ t("span", { className: e.progressMessage, onClick: () => y(!0), children: L }) }),
96
+ /* @__PURE__ */ r("button", { onClick: () => S(!0), title: `Cancel ${i}`, children: [
90
97
  /* @__PURE__ */ t(d, { type: "close", size: 12 }),
91
98
  " Cancel"
92
99
  ] })
@@ -98,69 +105,69 @@ const ye = ({ item: l, sourceId: k, sourceType: v, planId: c, type: o = "backup"
98
105
  /* @__PURE__ */ r("span", { children: [
99
106
  h,
100
107
  " / ",
101
- T,
108
+ z,
102
109
  " Files"
103
110
  ] }),
104
111
  /* @__PURE__ */ t("i", {}),
105
112
  /* @__PURE__ */ r("span", { children: [
106
- L(f),
113
+ j(f),
107
114
  " / ",
108
- L(P)
115
+ j(C)
109
116
  ] })
110
117
  ] }),
111
- /* @__PURE__ */ t("div", { className: e.ProgressStatsRight, children: o !== "restore" && /* @__PURE__ */ r(C, { children: [
118
+ /* @__PURE__ */ t("div", { className: e.ProgressStatsRight, children: i !== "restore" && /* @__PURE__ */ r(R, { children: [
112
119
  "Remaining: ",
113
- D(U)
120
+ se(H)
114
121
  ] }) })
115
122
  ] }),
116
123
  /* @__PURE__ */ t("div", { className: e.progressBar, children: /* @__PURE__ */ t(
117
124
  "div",
118
125
  {
119
- className: `${e.progressBarFill} ${u > 3 ? e.progressBarFilled : ""}`,
120
- style: { width: u + "%" },
126
+ className: `${e.progressBarFill} ${m > 3 ? e.progressBarFilled : ""} ${U ? e.progressBarDryRun : ""}`,
127
+ style: { width: m + "%" },
121
128
  children: /* @__PURE__ */ r("span", { children: [
122
- u,
129
+ m,
123
130
  "%"
124
131
  ] })
125
132
  }
126
133
  ) })
127
134
  ] }),
128
- O && /* @__PURE__ */ t(
129
- ne,
135
+ I && /* @__PURE__ */ t(
136
+ oe,
130
137
  {
131
- title: `Cancel ${o}`,
132
- message: /* @__PURE__ */ t(C, { children: `Are you sure you want to cancel the ${o} process?` }),
133
- closeModal: () => R(!1),
138
+ title: `Cancel ${i}`,
139
+ message: /* @__PURE__ */ t(R, { children: `Are you sure you want to cancel the ${i} process?` }),
140
+ closeModal: () => S(!1),
134
141
  width: "400px",
135
142
  primaryAction: {
136
- title: `Yes, Cancel ${o}`,
143
+ title: `Yes, Cancel ${i}`,
137
144
  type: "danger",
138
- isPending: o === "restore" ? B.isPending : w.isPending,
139
- action: () => Y()
145
+ isPending: i === "restore" ? B.isPending : w.isPending,
146
+ action: () => J()
140
147
  }
141
148
  }
142
149
  ),
143
- Q && /* @__PURE__ */ t(
144
- ie,
150
+ K && /* @__PURE__ */ t(
151
+ ce,
145
152
  {
146
153
  id: g,
147
- type: o,
154
+ type: i,
148
155
  planId: c,
149
- sourceId: k,
156
+ sourceId: b,
150
157
  sourceType: v,
151
- progressData: a,
158
+ progressData: o,
152
159
  inProgress: !0,
153
- close: () => S(!1)
160
+ close: () => y(!1)
154
161
  }
155
162
  )
156
163
  ] }, l.id),
157
- (a == null ? void 0 : a.mirrors) && Object.keys(a.mirrors).length > 0 && /* @__PURE__ */ r("div", { className: e.mirrorsSection, children: [
164
+ (o == null ? void 0 : o.mirrors) && Object.keys(o.mirrors).length > 0 && /* @__PURE__ */ r("div", { className: e.mirrorsSection, children: [
158
165
  /* @__PURE__ */ t("div", { className: e.mirrorsTitle, children: "Replicating" }),
159
- /* @__PURE__ */ t("div", { className: e.mirrorsList, children: Object.entries(a.mirrors).map(([i, n]) => {
160
- var q, x;
161
- const b = (x = (q = n.events) == null ? void 0 : q.slice().reverse().find((H) => H.resticData)) == null ? void 0 : x.resticData, p = b != null && b.percent_done ? Math.round(b.percent_done * 100) : 0, M = te(n);
162
- let m = e.mirrorPending;
163
- return n.status === "running" && (m = p > 0 ? e.mirrorRunning : e.mirrorRunningIndeterminate), n.status === "completed" && (m = e.mirrorCompleted), n.status === "failed" && (m = e.mirrorFailed), n.status === "retrying" && (m = e.mirrorRunningIndeterminate), /* @__PURE__ */ r("div", { className: e.mirrorItem, children: [
166
+ /* @__PURE__ */ t("div", { className: e.mirrorsList, children: Object.entries(o.mirrors).map(([a, n]) => {
167
+ var E, q;
168
+ const k = (q = (E = n.events) == null ? void 0 : E.slice().reverse().find((V) => V.resticData)) == null ? void 0 : q.resticData, p = k != null && k.percent_done ? Math.round(k.percent_done * 100) : 0, M = ie(n);
169
+ let u = e.mirrorPending;
170
+ return n.status === "running" && (u = p > 0 ? e.mirrorRunning : e.mirrorRunningIndeterminate), n.status === "completed" && (u = e.mirrorCompleted), n.status === "failed" && (u = e.mirrorFailed), n.status === "retrying" && (u = e.mirrorRunningIndeterminate), /* @__PURE__ */ r("div", { className: e.mirrorItem, children: [
164
171
  /* @__PURE__ */ r("div", { className: e.mirrorStorageIcon, children: [
165
172
  (n.status === "running" || n.status === "pending" || n.status === "retrying") && /* @__PURE__ */ t(d, { type: "loading", size: 12 }),
166
173
  /* @__PURE__ */ t("img", { src: `/providers/${n.storageType}.png` })
@@ -168,10 +175,10 @@ const ye = ({ item: l, sourceId: k, sourceType: v, planId: c, type: o = "backup"
168
175
  /* @__PURE__ */ r("div", { className: e.mirrorProgress, children: [
169
176
  /* @__PURE__ */ r("div", { className: e.mirrorInfo, children: [
170
177
  /* @__PURE__ */ t("span", { className: e.mirrorName, children: n.storageName }),
171
- /* @__PURE__ */ r("span", { className: `${e.mirrorStatus} ${m}`, children: [
178
+ /* @__PURE__ */ r("span", { className: `${e.mirrorStatus} ${u}`, children: [
172
179
  n.status === "pending" && "Pending",
173
180
  n.status === "running" && (p > 0 ? `${p}% — ${M}` : M),
174
- n.status === "completed" && /* @__PURE__ */ r(C, { children: [
181
+ n.status === "completed" && /* @__PURE__ */ r(R, { children: [
175
182
  /* @__PURE__ */ t(d, { type: "check", size: 10 }),
176
183
  " Completed"
177
184
  ] }),
@@ -185,19 +192,19 @@ const ye = ({ item: l, sourceId: k, sourceType: v, planId: c, type: o = "backup"
185
192
  /* @__PURE__ */ t("div", { className: e.mirrorBar, children: /* @__PURE__ */ t(
186
193
  "div",
187
194
  {
188
- className: `${e.mirrorBarFill} ${m}`,
195
+ className: `${e.mirrorBarFill} ${u}`,
189
196
  style: {
190
197
  width: n.status === "completed" || n.status === "failed" ? "100%" : p > 0 ? `${p}%` : void 0
191
198
  }
192
199
  }
193
200
  ) })
194
201
  ] })
195
- ] }, i);
202
+ ] }, a);
196
203
  }) })
197
204
  ] })
198
205
  ] }, l.id);
199
206
  };
200
207
  export {
201
- ye as default
208
+ _e as default
202
209
  };
203
210
  //# sourceMappingURL=BackupProgress.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackupProgress.js","sources":["../../../../src/components/Plan/BackupProgress/BackupProgress.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport { toast } from 'react-toastify';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport { useCancelBackup, useGetBackupProgress } from '../../../services/backups';\r\nimport classes from './BackupProgress.module.scss';\r\nimport { formatBytes, formatDateTime, formatSeconds, timeAgo } from '../../../utils/helpers';\r\nimport {\r\n generateBackupProgressMessage,\r\n extractResticData,\r\n generateRestoreProgressMessage,\r\n generateMirrorProgressMessage,\r\n} from '../../../utils/progressHelpers';\r\nimport { Backup } from '../../../@types/backups';\r\nimport { RestoreSlim } from '../../../@types/restores';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\nimport { useCancelRestore, useGetRestoreProgress } from '../../../services/restores';\r\nimport BackupEvents from '../BackupEvents/BackupEvents';\r\nimport { ReplicationProgressData } from '../../../@types/backups';\r\n\r\ninterface BackupProgressProps {\r\n item: Backup | RestoreSlim;\r\n sourceId: string;\r\n sourceType: string;\r\n planId: string;\r\n type: 'backup' | 'restore';\r\n}\r\n\r\nconst BackupProgress = ({ item, sourceId, sourceType, planId, type = 'backup' }: BackupProgressProps) => {\r\n const [showCancelModal, setShowCancelModal] = useState(false);\r\n const [showProgressDetails, setShowProgressDetails] = useState(false);\r\n const queryClient = useQueryClient();\r\n const cancelRestoreMutation = useCancelRestore();\r\n const cancelBackupMutation = useCancelBackup();\r\n\r\n const { id, started } = item;\r\n const { data: progressData } =\r\n type === 'backup' ? useGetBackupProgress({ id, sourceId, sourceType, planId }) : useGetRestoreProgress({ id, sourceId, sourceType, planId });\r\n\r\n console.log('#### data :', progressData);\r\n\r\n const resticData = extractResticData(progressData);\r\n const progressMessage = type === 'backup' ? generateBackupProgressMessage(progressData) : generateRestoreProgressMessage(progressData);\r\n\r\n // Extract progress values from restic data or use defaults\r\n const {\r\n total_files_processed: total_files = resticData?.total_files || 0,\r\n files_done = 0,\r\n total_bytes_processed: total_bytes = resticData?.total_bytes_processed || resticData?.total_bytes || 0,\r\n bytes_done = 0,\r\n bytes_restored = 0,\r\n files_restored = 0,\r\n seconds_remaining = 0,\r\n percent_done = 0,\r\n } = resticData || {};\r\n\r\n let filesProcessed = files_done;\r\n let bytesProcessed = bytes_done;\r\n let totalBytes = total_bytes;\r\n let totalFiles = total_files;\r\n let progressPercent = total_bytes ? Math.round((bytes_done / total_bytes) * 100) : 0;\r\n\r\n if (type === 'restore') {\r\n progressPercent = Math.round(percent_done * 100);\r\n if (resticData?.total_bytes) {\r\n totalBytes = resticData.total_bytes;\r\n }\r\n if (bytes_restored) {\r\n bytesProcessed = bytes_restored;\r\n } else {\r\n if (resticData?.total_bytes) {\r\n bytesProcessed = Math.round(percent_done * resticData.total_bytes);\r\n }\r\n }\r\n if (files_restored) {\r\n filesProcessed = files_restored;\r\n } else {\r\n if (resticData?.total_files) {\r\n filesProcessed = Math.round(percent_done * resticData.total_files);\r\n }\r\n }\r\n }\r\n\r\n // For completed backups, show 100% if we have summary data\r\n if (resticData?.message_type === 'summary') {\r\n progressPercent = 100;\r\n filesProcessed = totalFiles;\r\n bytesProcessed = totalBytes;\r\n }\r\n\r\n const cancel = () => {\r\n console.log('cancel :', type, item);\r\n if (type === 'backup') {\r\n toast.promise(\r\n cancelBackupMutation.mutateAsync(\r\n { planId, backupId: item.id },\r\n {\r\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['plan', planId] }),\r\n },\r\n ),\r\n {\r\n pending: 'Sending Cancel Request...',\r\n success: 'Backup process Cancelled!',\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to cancel backup process. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n );\r\n } else {\r\n toast.promise(\r\n cancelRestoreMutation.mutateAsync(\r\n { planId, restoreId: item.id },\r\n {\r\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['plan', planId] }),\r\n },\r\n ),\r\n {\r\n pending: 'Sending Cancel Request...',\r\n success: 'Restore process Cancelled!',\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to cancel restore process. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div key={item.id} className={classes.backup}>\r\n <div key={item.id} className={classes.backupProgress}>\r\n <div className={classes.backupIcon}>\r\n <Icon type=\"loading\" size={24} />\r\n </div>\r\n <div className={classes.backupLeft}>\r\n <div className={classes.backupId}>\r\n {type === 'restore' ? 'Restoring ' : ''}backup-{id}\r\n <span className={classes.backupTime} title={formatDateTime(started)}>\r\n <Icon type=\"clock\" size={12} /> Started {started ? timeAgo(new Date(started)) : 'a few seconds ago'}\r\n </span>\r\n {item.errorMsg && (\r\n <span className={classes.backupError}>\r\n <Icon type=\"error-circle-filled\" size={13} />{' '}\r\n <i data-tooltip-id=\"htmlToolTip\" data-tooltip-place=\"top\" data-tooltip-html={item.errorMsg}>\r\n <u>Error</u> Occurred.\r\n </i>{' '}\r\n Retrying...\r\n </span>\r\n )}\r\n </div>\r\n <div className={classes.backupStart}>\r\n <div>\r\n <span className={classes.progressMessage} onClick={() => setShowProgressDetails(true)}>\r\n {progressMessage}\r\n </span>\r\n {/* <Icon type=\"clock\" size={12} /> Started {started ? timeAgo(new Date(started)) : 'a few seconds ago'} */}\r\n </div>\r\n <button onClick={() => setShowCancelModal(true)} title={`Cancel ${type}`}>\r\n <Icon type=\"close\" size={12} /> Cancel\r\n </button>\r\n </div>\r\n </div>\r\n <div className={classes.backupRight}>\r\n <div className={classes.ProgressStats}>\r\n <div className={classes.ProgressStatsLeft}>\r\n <span>\r\n {filesProcessed} / {totalFiles} Files\r\n </span>\r\n <i></i>\r\n <span>\r\n {formatBytes(bytesProcessed)} / {formatBytes(totalBytes)}\r\n </span>\r\n </div>\r\n <div className={classes.ProgressStatsRight}>{type !== 'restore' && <>Remaining: {formatSeconds(seconds_remaining)}</>}</div>\r\n </div>\r\n <div className={classes.progressBar}>\r\n <div\r\n className={`${classes.progressBarFill} ${progressPercent > 3 ? classes.progressBarFilled : ''}`}\r\n style={{ width: progressPercent + '%' }}\r\n >\r\n <span>{progressPercent}%</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {showCancelModal && (\r\n <ActionModal\r\n title={`Cancel ${type}`}\r\n message={<>{`Are you sure you want to cancel the ${type} process?`}</>}\r\n closeModal={() => setShowCancelModal(false)}\r\n width=\"400px\"\r\n primaryAction={{\r\n title: `Yes, Cancel ${type}`,\r\n type: 'danger',\r\n isPending: type === 'restore' ? cancelRestoreMutation.isPending : cancelBackupMutation.isPending,\r\n action: () => cancel(),\r\n }}\r\n />\r\n )}\r\n {showProgressDetails && (\r\n <BackupEvents\r\n id={id}\r\n type={type}\r\n planId={planId}\r\n sourceId={sourceId}\r\n sourceType={sourceType}\r\n progressData={progressData}\r\n inProgress={true}\r\n close={() => setShowProgressDetails(false)}\r\n />\r\n )}\r\n </div>\r\n {/* Mirrors Progress */}\r\n {progressData?.mirrors && Object.keys(progressData.mirrors).length > 0 && (\r\n <div className={classes.mirrorsSection}>\r\n <div className={classes.mirrorsTitle}>Replicating</div>\r\n <div className={classes.mirrorsList}>\r\n {Object.entries(progressData.mirrors as Record<string, ReplicationProgressData>).map(([storageId, mirror]) => {\r\n const mirrorResticData = mirror.events\r\n ?.slice()\r\n .reverse()\r\n .find((e: any) => e.resticData)?.resticData;\r\n const mirrorPercent = mirrorResticData?.percent_done ? Math.round(mirrorResticData.percent_done * 100) : 0;\r\n const mirrorMessage = generateMirrorProgressMessage(mirror);\r\n\r\n let mirrorStatusClass = classes.mirrorPending;\r\n if (mirror.status === 'running')\r\n mirrorStatusClass = mirrorPercent > 0 ? classes.mirrorRunning : classes.mirrorRunningIndeterminate;\r\n if (mirror.status === 'completed') mirrorStatusClass = classes.mirrorCompleted;\r\n if (mirror.status === 'failed') mirrorStatusClass = classes.mirrorFailed;\r\n if (mirror.status === 'retrying') mirrorStatusClass = classes.mirrorRunningIndeterminate;\r\n\r\n return (\r\n <div key={storageId} className={classes.mirrorItem}>\r\n <div className={classes.mirrorStorageIcon}>\r\n {(mirror.status === 'running' || mirror.status === 'pending' || mirror.status === 'retrying') && (\r\n <Icon type=\"loading\" size={12} />\r\n )}\r\n <img src={`/providers/${mirror.storageType}.png`} />\r\n </div>\r\n <div className={classes.mirrorProgress}>\r\n <div className={classes.mirrorInfo}>\r\n <span className={classes.mirrorName}>{mirror.storageName}</span>\r\n <span className={`${classes.mirrorStatus} ${mirrorStatusClass}`}>\r\n {mirror.status === 'pending' && 'Pending'}\r\n {mirror.status === 'running' && (mirrorPercent > 0 ? `${mirrorPercent}% — ${mirrorMessage}` : mirrorMessage)}\r\n {mirror.status === 'completed' && (\r\n <>\r\n <Icon type=\"check\" size={10} /> Completed\r\n </>\r\n )}\r\n {mirror.status === 'failed' && (\r\n <span data-tooltip-id=\"htmlToolTip\" data-tooltip-html={mirror.error || 'Replication failed'}>\r\n <Icon type=\"error\" size={12} /> Failed\r\n </span>\r\n )}\r\n {mirror.status === 'retrying' && mirrorMessage}\r\n </span>\r\n </div>\r\n <div className={classes.mirrorBar}>\r\n <div\r\n className={`${classes.mirrorBarFill} ${mirrorStatusClass}`}\r\n style={{\r\n width:\r\n mirror.status === 'completed'\r\n ? '100%'\r\n : mirror.status === 'failed'\r\n ? '100%'\r\n : mirrorPercent > 0\r\n ? `${mirrorPercent}%`\r\n : undefined,\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\nexport default BackupProgress;\r\n"],"names":["BackupProgress","item","sourceId","sourceType","planId","type","showCancelModal","setShowCancelModal","useState","showProgressDetails","setShowProgressDetails","queryClient","useQueryClient","cancelRestoreMutation","useCancelRestore","cancelBackupMutation","useCancelBackup","id","started","progressData","useGetBackupProgress","useGetRestoreProgress","resticData","extractResticData","progressMessage","generateBackupProgressMessage","generateRestoreProgressMessage","total_files","files_done","total_bytes","bytes_done","bytes_restored","files_restored","seconds_remaining","percent_done","filesProcessed","bytesProcessed","totalBytes","totalFiles","progressPercent","cancel","toast","data","jsxs","classes","jsx","Icon","formatDateTime","timeAgo","formatBytes","Fragment","formatSeconds","ActionModal","BackupEvents","storageId","mirror","mirrorResticData","_b","_a","e","mirrorPercent","mirrorMessage","generateMirrorProgressMessage","mirrorStatusClass"],"mappings":";;;;;;;;;;;;AA4BA,MAAMA,KAAiB,CAAC,EAAE,MAAAC,GAAM,UAAAC,GAAU,YAAAC,GAAY,QAAAC,GAAQ,MAAAC,IAAO,eAAoC;AACtG,QAAM,CAACC,GAAiBC,CAAkB,IAAIC,EAAS,EAAK,GACtD,CAACC,GAAqBC,CAAsB,IAAIF,EAAS,EAAK,GAC9DG,IAAcC,EAAA,GACdC,IAAwBC,GAAA,GACxBC,IAAuBC,EAAA,GAEvB,EAAE,IAAAC,GAAI,SAAAC,EAAA,IAAYjB,GAClB,EAAE,MAAMkB,EAAA,IACXd,MAAS,WAAWe,EAAqB,EAAE,IAAAH,GAAI,UAAAf,GAAU,YAAAC,GAAY,QAAAC,EAAA,CAAQ,IAAIiB,GAAsB,EAAE,IAAAJ,GAAI,UAAAf,GAAU,YAAAC,GAAY,QAAAC,GAAQ;AAE9I,UAAQ,IAAI,eAAee,CAAY;AAEvC,QAAMG,IAAaC,GAAkBJ,CAAY,GAC3CK,IAAkBnB,MAAS,WAAWoB,GAA8BN,CAAY,IAAIO,GAA+BP,CAAY,GAG/H;AAAA,IACH,uBAAuBQ,KAAcL,KAAA,gBAAAA,EAAY,gBAAe;AAAA,IAChE,YAAAM,IAAa;AAAA,IACb,uBAAuBC,KAAcP,KAAA,gBAAAA,EAAY,2BAAyBA,KAAA,gBAAAA,EAAY,gBAAe;AAAA,IACrG,YAAAQ,IAAa;AAAA,IACb,gBAAAC,IAAiB;AAAA,IACjB,gBAAAC,IAAiB;AAAA,IACjB,mBAAAC,IAAoB;AAAA,IACpB,cAAAC,IAAe;AAAA,EAAA,IACdZ,KAAc,CAAA;AAElB,MAAIa,IAAiBP,GACjBQ,IAAiBN,GACjBO,IAAaR,GACbS,IAAaX,GACbY,IAAkBV,IAAc,KAAK,MAAOC,IAAaD,IAAe,GAAG,IAAI;AAEnF,EAAIxB,MAAS,cACVkC,IAAkB,KAAK,MAAML,IAAe,GAAG,GAC3CZ,KAAA,QAAAA,EAAY,gBACbe,IAAaf,EAAW,cAEvBS,IACDK,IAAiBL,IAEbT,KAAA,QAAAA,EAAY,gBACbc,IAAiB,KAAK,MAAMF,IAAeZ,EAAW,WAAW,IAGnEU,IACDG,IAAiBH,IAEbV,KAAA,QAAAA,EAAY,gBACba,IAAiB,KAAK,MAAMD,IAAeZ,EAAW,WAAW,MAMtEA,KAAA,gBAAAA,EAAY,kBAAiB,cAC9BiB,IAAkB,KAClBJ,IAAiBG,GACjBF,IAAiBC;AAGpB,QAAMG,IAAS,MAAM;AAClB,YAAQ,IAAI,YAAYnC,GAAMJ,CAAI,GAC9BI,MAAS,WACVoC,EAAM;AAAA,MACH1B,EAAqB;AAAA,QAClB,EAAE,QAAAX,GAAQ,UAAUH,EAAK,GAAA;AAAA,QACzB;AAAA,UACG,WAAW,MAAMU,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQP,CAAM,EAAA,CAAG;AAAA,QAAA;AAAA,MAChF;AAAA,MAEH;AAAA,QACG,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,UACJ,OAAO,EAAE,MAAAsC,KAAa;AAEnB,mBAAO,qCAAoCA,KAAA,gBAAAA,EAAM,YAAW,gBAAgB;AAAA,UAC/E;AAAA,QAAA;AAAA,MACH;AAAA,IACH,IAGHD,EAAM;AAAA,MACH5B,EAAsB;AAAA,QACnB,EAAE,QAAAT,GAAQ,WAAWH,EAAK,GAAA;AAAA,QAC1B;AAAA,UACG,WAAW,MAAMU,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQP,CAAM,EAAA,CAAG;AAAA,QAAA;AAAA,MAChF;AAAA,MAEH;AAAA,QACG,SAAS;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,UACJ,OAAO,EAAE,MAAAsC,KAAa;AAEnB,mBAAO,sCAAqCA,KAAA,gBAAAA,EAAM,YAAW,gBAAgB;AAAA,UAChF;AAAA,QAAA;AAAA,MACH;AAAA,IACH;AAAA,EAGT;AAEA,SACG,gBAAAC,EAAC,OAAA,EAAkB,WAAWC,EAAQ,QACnC,UAAA;AAAA,IAAA,gBAAAD,EAAC,OAAA,EAAkB,WAAWC,EAAQ,gBACnC,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,YACrB,UAAA,gBAAAC,EAACC,KAAK,MAAK,WAAU,MAAM,GAAA,CAAI,EAAA,CAClC;AAAA,MACA,gBAAAH,EAAC,OAAA,EAAI,WAAWC,EAAQ,YACrB,UAAA;AAAA,QAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,UACpB,UAAA;AAAA,UAAAvC,MAAS,YAAY,eAAe;AAAA,UAAG;AAAA,UAAQY;AAAA,UAChD,gBAAA0B,EAAC,UAAK,WAAWC,EAAQ,YAAY,OAAOG,EAAe7B,CAAO,GAC/D,UAAA;AAAA,YAAA,gBAAA2B,EAACC,GAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA,YAAE;AAAA,YAAU5B,IAAU8B,EAAQ,IAAI,KAAK9B,CAAO,CAAC,IAAI;AAAA,UAAA,GACnF;AAAA,UACCjB,EAAK,YACH,gBAAA0C,EAAC,QAAA,EAAK,WAAWC,EAAQ,aACtB,UAAA;AAAA,YAAA,gBAAAC,EAACC,GAAA,EAAK,MAAK,uBAAsB,MAAM,IAAI;AAAA,YAAG;AAAA,YAC9C,gBAAAH,EAAC,OAAE,mBAAgB,eAAc,sBAAmB,OAAM,qBAAmB1C,EAAK,UAC/E,UAAA;AAAA,cAAA,gBAAA4C,EAAC,OAAE,UAAA,QAAA,CAAK;AAAA,cAAI;AAAA,YAAA,GACf;AAAA,YAAK;AAAA,YAAI;AAAA,UAAA,EAAA,CAEZ;AAAA,QAAA,GAEN;AAAA,QACA,gBAAAF,EAAC,OAAA,EAAI,WAAWC,EAAQ,aACrB,UAAA;AAAA,UAAA,gBAAAC,EAAC,OAAA,EACE,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAWD,EAAQ,iBAAiB,SAAS,MAAMlC,EAAuB,EAAI,GAChF,UAAAc,EAAA,CACJ,GAEH;AAAA,UACA,gBAAAmB,EAAC,UAAA,EAAO,SAAS,MAAMpC,EAAmB,EAAI,GAAG,OAAO,UAAUF,CAAI,IACnE,UAAA;AAAA,YAAA,gBAAAwC,EAACC,GAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA,YAAE;AAAA,UAAA,EAAA,CAClC;AAAA,QAAA,EAAA,CACH;AAAA,MAAA,GACH;AAAA,MACA,gBAAAH,EAAC,OAAA,EAAI,WAAWC,EAAQ,aACrB,UAAA;AAAA,QAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,eACrB,UAAA;AAAA,UAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,mBACrB,UAAA;AAAA,YAAA,gBAAAD,EAAC,QAAA,EACG,UAAA;AAAA,cAAAR;AAAA,cAAe;AAAA,cAAIG;AAAA,cAAW;AAAA,YAAA,GAClC;AAAA,8BACC,KAAA,EAAE;AAAA,8BACF,QAAA,EACG,UAAA;AAAA,cAAAW,EAAYb,CAAc;AAAA,cAAE;AAAA,cAAIa,EAAYZ,CAAU;AAAA,YAAA,EAAA,CAC1D;AAAA,UAAA,GACH;AAAA,4BACC,OAAA,EAAI,WAAWO,EAAQ,oBAAqB,UAAAvC,MAAS,aAAa,gBAAAsC,EAAAO,GAAA,EAAE,UAAA;AAAA,YAAA;AAAA,YAAYC,EAAclB,CAAiB;AAAA,UAAA,EAAA,CAAE,EAAA,CAAI;AAAA,QAAA,GACzH;AAAA,QACA,gBAAAY,EAAC,OAAA,EAAI,WAAWD,EAAQ,aACrB,UAAA,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACE,WAAW,GAAGD,EAAQ,eAAe,IAAIL,IAAkB,IAAIK,EAAQ,oBAAoB,EAAE;AAAA,YAC7F,OAAO,EAAE,OAAOL,IAAkB,IAAA;AAAA,YAElC,4BAAC,QAAA,EAAM,UAAA;AAAA,cAAAA;AAAA,cAAgB;AAAA,YAAA,EAAA,CAAC;AAAA,UAAA;AAAA,QAAA,EAC3B,CACH;AAAA,MAAA,GACH;AAAA,MAECjC,KACE,gBAAAuC;AAAA,QAACO;AAAA,QAAA;AAAA,UACE,OAAO,UAAU/C,CAAI;AAAA,UACrB,SAAS,gBAAAwC,EAAAK,GAAA,EAAG,UAAA,uCAAuC7C,CAAI,aAAY;AAAA,UACnE,YAAY,MAAME,EAAmB,EAAK;AAAA,UAC1C,OAAM;AAAA,UACN,eAAe;AAAA,YACZ,OAAO,eAAeF,CAAI;AAAA,YAC1B,MAAM;AAAA,YACN,WAAWA,MAAS,YAAYQ,EAAsB,YAAYE,EAAqB;AAAA,YACvF,QAAQ,MAAMyB,EAAA;AAAA,UAAO;AAAA,QACxB;AAAA,MAAA;AAAA,MAGL/B,KACE,gBAAAoC;AAAA,QAACQ;AAAA,QAAA;AAAA,UACE,IAAApC;AAAA,UACA,MAAAZ;AAAA,UACA,QAAAD;AAAA,UACA,UAAAF;AAAA,UACA,YAAAC;AAAA,UACA,cAAAgB;AAAA,UACA,YAAY;AAAA,UACZ,OAAO,MAAMT,EAAuB,EAAK;AAAA,QAAA;AAAA,MAAA;AAAA,IAC5C,EAAA,GA/EIT,EAAK,EAiFf;AAAA,KAECkB,KAAA,gBAAAA,EAAc,YAAW,OAAO,KAAKA,EAAa,OAAO,EAAE,SAAS,KAClE,gBAAAwB,EAAC,OAAA,EAAI,WAAWC,EAAQ,gBACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,cAAc,UAAA,eAAW;AAAA,MACjD,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,aACpB,UAAA,OAAO,QAAQzB,EAAa,OAAkD,EAAE,IAAI,CAAC,CAACmC,GAAWC,CAAM,MAAM;;AAC3G,cAAMC,KAAmBC,KAAAC,IAAAH,EAAO,WAAP,gBAAAG,EACpB,QACD,UACA,KAAK,CAACC,MAAWA,EAAE,gBAHE,gBAAAF,EAGW,YAC9BG,IAAgBJ,KAAA,QAAAA,EAAkB,eAAe,KAAK,MAAMA,EAAiB,eAAe,GAAG,IAAI,GACnGK,IAAgBC,GAA8BP,CAAM;AAE1D,YAAIQ,IAAoBnB,EAAQ;AAChC,eAAIW,EAAO,WAAW,cACnBQ,IAAoBH,IAAgB,IAAIhB,EAAQ,gBAAgBA,EAAQ,6BACvEW,EAAO,WAAW,gBAAaQ,IAAoBnB,EAAQ,kBAC3DW,EAAO,WAAW,aAAUQ,IAAoBnB,EAAQ,eACxDW,EAAO,WAAW,eAAYQ,IAAoBnB,EAAQ,6BAG3D,gBAAAD,EAAC,OAAA,EAAoB,WAAWC,EAAQ,YACrC,UAAA;AAAA,UAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,mBACnB,UAAA;AAAA,aAAAW,EAAO,WAAW,aAAaA,EAAO,WAAW,aAAaA,EAAO,WAAW,eAC/E,gBAAAV,EAACC,GAAA,EAAK,MAAK,WAAU,MAAM,IAAI;AAAA,8BAEjC,OAAA,EAAI,KAAK,cAAcS,EAAO,WAAW,OAAA,CAAQ;AAAA,UAAA,GACrD;AAAA,UACA,gBAAAZ,EAAC,OAAA,EAAI,WAAWC,EAAQ,gBACrB,UAAA;AAAA,YAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,YACrB,UAAA;AAAA,cAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAQ,YAAa,YAAO,aAAY;AAAA,cACzD,gBAAAD,EAAC,UAAK,WAAW,GAAGC,EAAQ,YAAY,IAAImB,CAAiB,IACzD,UAAA;AAAA,gBAAAR,EAAO,WAAW,aAAa;AAAA,gBAC/BA,EAAO,WAAW,cAAcK,IAAgB,IAAI,GAAGA,CAAa,OAAOC,CAAa,KAAKA;AAAA,gBAC7FN,EAAO,WAAW,eAChB,gBAAAZ,EAAAO,GAAA,EACG,UAAA;AAAA,kBAAA,gBAAAL,EAACC,GAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA,kBAAE;AAAA,gBAAA,GAClC;AAAA,gBAEFS,EAAO,WAAW,YAChB,gBAAAZ,EAAC,QAAA,EAAK,mBAAgB,eAAc,qBAAmBY,EAAO,SAAS,sBACpE,UAAA;AAAA,kBAAA,gBAAAV,EAACC,GAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA,kBAAE;AAAA,gBAAA,GAClC;AAAA,gBAEFS,EAAO,WAAW,cAAcM;AAAA,cAAA,EAAA,CACpC;AAAA,YAAA,GACH;AAAA,YACA,gBAAAhB,EAAC,OAAA,EAAI,WAAWD,EAAQ,WACrB,UAAA,gBAAAC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACE,WAAW,GAAGD,EAAQ,aAAa,IAAImB,CAAiB;AAAA,gBACxD,OAAO;AAAA,kBACJ,OACGR,EAAO,WAAW,eAEbA,EAAO,WAAW,WADlB,SAGEK,IAAgB,IACd,GAAGA,CAAa,MAChB;AAAA,gBAAA;AAAA,cACf;AAAA,YAAA,EACH,CACH;AAAA,UAAA,EAAA,CACH;AAAA,QAAA,EAAA,GAzCON,CA0CV;AAAA,MAEN,CAAC,EAAA,CACJ;AAAA,IAAA,EAAA,CACH;AAAA,EAAA,EAAA,GAtJIrD,EAAK,EAwJf;AAEN;"}
1
+ {"version":3,"file":"BackupProgress.js","sources":["../../../../src/components/Plan/BackupProgress/BackupProgress.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport { toast } from 'react-toastify';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport { useCancelBackup, useGetBackupProgress } from '../../../services/backups';\r\nimport classes from './BackupProgress.module.scss';\r\nimport { formatBytes, formatDateTime, formatSeconds, timeAgo } from '../../../utils/helpers';\r\nimport {\r\n generateBackupProgressMessage,\r\n extractResticData,\r\n generateRestoreProgressMessage,\r\n generateMirrorProgressMessage,\r\n} from '../../../utils/progressHelpers';\r\nimport { Backup } from '../../../@types/backups';\r\nimport { RestoreSlim } from '../../../@types/restores';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\nimport { useCancelRestore, useGetRestoreProgress } from '../../../services/restores';\r\nimport BackupEvents from '../BackupEvents/BackupEvents';\r\nimport { ReplicationProgressData } from '../../../@types/backups';\r\n\r\ninterface BackupProgressProps {\r\n item: Backup | RestoreSlim;\r\n sourceId: string;\r\n sourceType: string;\r\n planId: string;\r\n type: 'backup' | 'restore';\r\n}\r\n\r\nconst BackupProgress = ({ item, sourceId, sourceType, planId, type = 'backup' }: BackupProgressProps) => {\r\n const [showCancelModal, setShowCancelModal] = useState(false);\r\n const [showProgressDetails, setShowProgressDetails] = useState(false);\r\n const queryClient = useQueryClient();\r\n const cancelRestoreMutation = useCancelRestore();\r\n const cancelBackupMutation = useCancelBackup();\r\n\r\n const { id, started } = item;\r\n const { data: progressData } =\r\n type === 'backup' ? useGetBackupProgress({ id, sourceId, sourceType, planId }) : useGetRestoreProgress({ id, sourceId, sourceType, planId });\r\n\r\n const resticData = extractResticData(progressData);\r\n const progressMessage = type === 'backup' ? generateBackupProgressMessage(progressData) : generateRestoreProgressMessage(progressData);\r\n\r\n // Check if DryRun progress tracking phase\r\n const actualBackupStarted = progressData?.events.find((e: any) => e.action === 'BACKUP_OPERATION_START' && e.resticData);\r\n const isDryRun = type === 'backup' && !actualBackupStarted;\r\n\r\n // Extract progress values from restic data or use defaults\r\n const {\r\n total_files_processed: total_files = resticData?.total_files || 0,\r\n files_done = 0,\r\n total_bytes_processed: total_bytes = resticData?.total_bytes_processed || resticData?.total_bytes || 0,\r\n bytes_done = 0,\r\n bytes_restored = 0,\r\n files_restored = 0,\r\n seconds_remaining = 0,\r\n percent_done = 0,\r\n } = resticData || {};\r\n\r\n let filesProcessed = files_done;\r\n let bytesProcessed = bytes_done;\r\n let totalBytes = total_bytes;\r\n let totalFiles = total_files;\r\n let progressPercent = total_bytes ? Math.round((bytes_done / total_bytes) * 100) : 0;\r\n\r\n if (type === 'restore') {\r\n progressPercent = Math.round(percent_done * 100);\r\n if (resticData?.total_bytes) {\r\n totalBytes = resticData.total_bytes;\r\n }\r\n if (bytes_restored) {\r\n bytesProcessed = bytes_restored;\r\n } else {\r\n if (resticData?.total_bytes) {\r\n bytesProcessed = Math.round(percent_done * resticData.total_bytes);\r\n }\r\n }\r\n if (files_restored) {\r\n filesProcessed = files_restored;\r\n } else {\r\n if (resticData?.total_files) {\r\n filesProcessed = Math.round(percent_done * resticData.total_files);\r\n }\r\n }\r\n }\r\n\r\n // For completed backups, show 100% if we have summary data\r\n if (resticData?.message_type === 'summary') {\r\n progressPercent = 100;\r\n filesProcessed = totalFiles;\r\n bytesProcessed = totalBytes;\r\n }\r\n\r\n const cancel = () => {\r\n console.log('cancel :', type, item);\r\n if (type === 'backup') {\r\n toast.promise(\r\n cancelBackupMutation.mutateAsync(\r\n { planId, backupId: item.id },\r\n {\r\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['plan', planId] }),\r\n },\r\n ),\r\n {\r\n pending: 'Sending Cancel Request...',\r\n success: 'Backup process Cancelled!',\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to cancel backup process. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n );\r\n } else {\r\n toast.promise(\r\n cancelRestoreMutation.mutateAsync(\r\n { planId, restoreId: item.id },\r\n {\r\n onSuccess: () => queryClient.invalidateQueries({ queryKey: ['plan', planId] }),\r\n },\r\n ),\r\n {\r\n pending: 'Sending Cancel Request...',\r\n success: 'Restore process Cancelled!',\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to cancel restore process. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div key={item.id} className={classes.backup}>\r\n <div key={item.id} className={classes.backupProgress}>\r\n <div className={classes.backupIcon}>\r\n <Icon type=\"loading\" size={24} />\r\n </div>\r\n <div className={classes.backupLeft}>\r\n <div className={classes.backupId}>\r\n {type === 'restore' ? 'Restoring ' : ''}backup-{id}\r\n <span className={classes.backupTime} title={formatDateTime(started)}>\r\n <Icon type=\"clock\" size={12} /> Started {started ? timeAgo(new Date(started)) : 'a few seconds ago'}\r\n </span>\r\n {item.errorMsg && (\r\n <span className={classes.backupError}>\r\n <Icon type=\"error-circle-filled\" size={13} />{' '}\r\n <i\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-html={`<div class=\"linebreak-tooltip-content\">${item.errorMsg.slice(0, 120) + (item.errorMsg.length > 120 ? '...' : '')}</div>`}\r\n onClick={() => setShowProgressDetails(true)}\r\n >\r\n <u>Error</u> Occurred.\r\n </i>{' '}\r\n Retrying...\r\n </span>\r\n )}\r\n </div>\r\n <div className={classes.backupStart}>\r\n <div>\r\n <span className={classes.progressMessage} onClick={() => setShowProgressDetails(true)}>\r\n {progressMessage}\r\n </span>\r\n {/* <Icon type=\"clock\" size={12} /> Started {started ? timeAgo(new Date(started)) : 'a few seconds ago'} */}\r\n </div>\r\n <button onClick={() => setShowCancelModal(true)} title={`Cancel ${type}`}>\r\n <Icon type=\"close\" size={12} /> Cancel\r\n </button>\r\n </div>\r\n </div>\r\n <div className={classes.backupRight}>\r\n <div className={classes.ProgressStats}>\r\n <div className={classes.ProgressStatsLeft}>\r\n <span>\r\n {filesProcessed} / {totalFiles} Files\r\n </span>\r\n <i></i>\r\n <span>\r\n {formatBytes(bytesProcessed)} / {formatBytes(totalBytes)}\r\n </span>\r\n </div>\r\n <div className={classes.ProgressStatsRight}>{type !== 'restore' && <>Remaining: {formatSeconds(seconds_remaining)}</>}</div>\r\n </div>\r\n <div className={classes.progressBar}>\r\n <div\r\n className={`${classes.progressBarFill} ${progressPercent > 3 ? classes.progressBarFilled : ''} ${isDryRun ? classes.progressBarDryRun : ''}`}\r\n style={{ width: progressPercent + '%' }}\r\n >\r\n <span>{progressPercent}%</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {showCancelModal && (\r\n <ActionModal\r\n title={`Cancel ${type}`}\r\n message={<>{`Are you sure you want to cancel the ${type} process?`}</>}\r\n closeModal={() => setShowCancelModal(false)}\r\n width=\"400px\"\r\n primaryAction={{\r\n title: `Yes, Cancel ${type}`,\r\n type: 'danger',\r\n isPending: type === 'restore' ? cancelRestoreMutation.isPending : cancelBackupMutation.isPending,\r\n action: () => cancel(),\r\n }}\r\n />\r\n )}\r\n {showProgressDetails && (\r\n <BackupEvents\r\n id={id}\r\n type={type}\r\n planId={planId}\r\n sourceId={sourceId}\r\n sourceType={sourceType}\r\n progressData={progressData}\r\n inProgress={true}\r\n close={() => setShowProgressDetails(false)}\r\n />\r\n )}\r\n </div>\r\n {/* Mirrors Progress */}\r\n {progressData?.mirrors && Object.keys(progressData.mirrors).length > 0 && (\r\n <div className={classes.mirrorsSection}>\r\n <div className={classes.mirrorsTitle}>Replicating</div>\r\n <div className={classes.mirrorsList}>\r\n {Object.entries(progressData.mirrors as Record<string, ReplicationProgressData>).map(([storageId, mirror]) => {\r\n const mirrorResticData = mirror.events\r\n ?.slice()\r\n .reverse()\r\n .find((e: any) => e.resticData)?.resticData;\r\n const mirrorPercent = mirrorResticData?.percent_done ? Math.round(mirrorResticData.percent_done * 100) : 0;\r\n const mirrorMessage = generateMirrorProgressMessage(mirror);\r\n\r\n let mirrorStatusClass = classes.mirrorPending;\r\n if (mirror.status === 'running')\r\n mirrorStatusClass = mirrorPercent > 0 ? classes.mirrorRunning : classes.mirrorRunningIndeterminate;\r\n if (mirror.status === 'completed') mirrorStatusClass = classes.mirrorCompleted;\r\n if (mirror.status === 'failed') mirrorStatusClass = classes.mirrorFailed;\r\n if (mirror.status === 'retrying') mirrorStatusClass = classes.mirrorRunningIndeterminate;\r\n\r\n return (\r\n <div key={storageId} className={classes.mirrorItem}>\r\n <div className={classes.mirrorStorageIcon}>\r\n {(mirror.status === 'running' || mirror.status === 'pending' || mirror.status === 'retrying') && (\r\n <Icon type=\"loading\" size={12} />\r\n )}\r\n <img src={`/providers/${mirror.storageType}.png`} />\r\n </div>\r\n <div className={classes.mirrorProgress}>\r\n <div className={classes.mirrorInfo}>\r\n <span className={classes.mirrorName}>{mirror.storageName}</span>\r\n <span className={`${classes.mirrorStatus} ${mirrorStatusClass}`}>\r\n {mirror.status === 'pending' && 'Pending'}\r\n {mirror.status === 'running' && (mirrorPercent > 0 ? `${mirrorPercent}% — ${mirrorMessage}` : mirrorMessage)}\r\n {mirror.status === 'completed' && (\r\n <>\r\n <Icon type=\"check\" size={10} /> Completed\r\n </>\r\n )}\r\n {mirror.status === 'failed' && (\r\n <span data-tooltip-id=\"htmlToolTip\" data-tooltip-html={mirror.error || 'Replication failed'}>\r\n <Icon type=\"error\" size={12} /> Failed\r\n </span>\r\n )}\r\n {mirror.status === 'retrying' && mirrorMessage}\r\n </span>\r\n </div>\r\n <div className={classes.mirrorBar}>\r\n <div\r\n className={`${classes.mirrorBarFill} ${mirrorStatusClass}`}\r\n style={{\r\n width:\r\n mirror.status === 'completed'\r\n ? '100%'\r\n : mirror.status === 'failed'\r\n ? '100%'\r\n : mirrorPercent > 0\r\n ? `${mirrorPercent}%`\r\n : undefined,\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\nexport default BackupProgress;\r\n"],"names":["BackupProgress","item","sourceId","sourceType","planId","type","showCancelModal","setShowCancelModal","useState","showProgressDetails","setShowProgressDetails","queryClient","useQueryClient","cancelRestoreMutation","useCancelRestore","cancelBackupMutation","useCancelBackup","id","started","progressData","useGetBackupProgress","useGetRestoreProgress","resticData","extractResticData","progressMessage","generateBackupProgressMessage","generateRestoreProgressMessage","actualBackupStarted","e","isDryRun","total_files","files_done","total_bytes","bytes_done","bytes_restored","files_restored","seconds_remaining","percent_done","filesProcessed","bytesProcessed","totalBytes","totalFiles","progressPercent","cancel","toast","data","jsxs","classes","jsx","Icon","formatDateTime","timeAgo","formatBytes","Fragment","formatSeconds","ActionModal","BackupEvents","storageId","mirror","mirrorResticData","_b","_a","mirrorPercent","mirrorMessage","generateMirrorProgressMessage","mirrorStatusClass"],"mappings":"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"}