@plutonhq/core-frontend 0.1.32 → 0.1.34
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.
- package/dist-lib/@types/plans.d.ts +4 -0
- package/dist-lib/@types/plans.d.ts.map +1 -1
- package/dist-lib/components/Device/DeviceResticSettings/DeviceResticSettings.js +4 -4
- package/dist-lib/components/Device/DeviceResticSettings/DeviceResticSettings.js.map +1 -1
- package/dist-lib/components/Plan/AddPlan/AddPlan.d.ts.map +1 -1
- package/dist-lib/components/Plan/AddPlan/AddPlan.js +29 -24
- package/dist-lib/components/Plan/AddPlan/AddPlan.js.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +34 -33
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts +9 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts.map +1 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.js +117 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.js.map +1 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js +20 -0
- package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts +4 -2
- package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanForm/PlanForm.js +33 -29
- package/dist-lib/components/Plan/PlanForm/PlanForm.js.map +1 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts +2 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js +85 -57
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js.map +1 -1
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js +11 -9
- package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanItems/PlanItem.js +1 -1
- package/dist-lib/components/Plan/PlanItems/PlanItem.js.map +1 -1
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts +9 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts.map +1 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.js +262 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.js.map +1 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js +14 -0
- package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts +4 -2
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js +24 -22
- package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts +4 -2
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js +39 -28
- package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanPerformanceSettings.js +2 -2
- package/dist-lib/components/Plan/PlanSettings/PlanPerformanceSettings.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js +66 -64
- package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts +7 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts.map +1 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js +116 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js.map +1 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js +20 -0
- package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanStats/PlanStats.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanStats/PlanStats.js +29 -30
- package/dist-lib/components/Plan/PlanStats/PlanStats.js.map +1 -1
- package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js +16 -14
- package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js.map +1 -1
- package/dist-lib/components/common/FileManager/FileManager.module.scss.js +18 -16
- package/dist-lib/components/common/FileManager/FileManager.module.scss.js.map +1 -1
- package/dist-lib/components/common/Icon/Icon.d.ts.map +1 -1
- package/dist-lib/components/common/Icon/Icon.js +395 -378
- package/dist-lib/components/common/Icon/Icon.js.map +1 -1
- package/dist-lib/components/common/SortItems/SortItems.d.ts +2 -1
- package/dist-lib/components/common/SortItems/SortItems.d.ts.map +1 -1
- package/dist-lib/components/common/SortItems/SortItems.js +14 -14
- package/dist-lib/components/common/SortItems/SortItems.js.map +1 -1
- package/dist-lib/components/common/SortItems/SortItems.module.scss.js +1 -1
- package/dist-lib/components/common/form/MultiSelect/MultiSelect.module.scss.js +16 -16
- package/dist-lib/components/index.d.ts +2 -0
- package/dist-lib/components/index.d.ts.map +1 -1
- package/dist-lib/components.js +199 -195
- package/dist-lib/components.js.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.js +22 -19
- package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
- package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js +449 -0
- package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js.map +1 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js +5219 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js.map +1 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js +1691 -0
- package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js.map +1 -0
- package/dist-lib/node_modules/.pnpm/react-chartjs-2@5.3.1_chart.js@4.5.1_react@18.3.1/node_modules/react-chartjs-2/dist/index.js +93 -0
- package/dist-lib/node_modules/.pnpm/react-chartjs-2@5.3.1_chart.js@4.5.1_react@18.3.1/node_modules/react-chartjs-2/dist/index.js.map +1 -0
- package/dist-lib/routes/Login/Login.d.ts.map +1 -1
- package/dist-lib/routes/Login/Login.js +45 -36
- package/dist-lib/routes/Login/Login.js.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.js +131 -118
- package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
- package/dist-lib/routes/Plans/Plans.d.ts.map +1 -1
- package/dist-lib/routes/Plans/Plans.js +77 -51
- package/dist-lib/routes/Plans/Plans.js.map +1 -1
- package/dist-lib/services/plans.d.ts +33 -5
- package/dist-lib/services/plans.d.ts.map +1 -1
- package/dist-lib/services/plans.js +92 -67
- package/dist-lib/services/plans.js.map +1 -1
- package/dist-lib/services.js +93 -91
- package/dist-lib/styles/core-frontend.css +1 -1
- package/dist-lib/utils/helpers.d.ts +2 -0
- package/dist-lib/utils/helpers.d.ts.map +1 -1
- package/dist-lib/utils/helpers.js +68 -42
- package/dist-lib/utils/helpers.js.map +1 -1
- package/dist-lib/utils.js +36 -34
- package/package.json +3 -1
- package/src/@types/plans.ts +5 -0
- package/src/components/Device/DeviceResticSettings/DeviceResticSettings.tsx +2 -2
- package/src/components/Plan/AddPlan/AddPlan.tsx +22 -16
- package/src/components/Plan/BackupProgress/BackupProgress.tsx +1 -1
- package/src/components/Plan/FilterPlans/FilterPlans.module.scss +65 -0
- package/src/components/Plan/FilterPlans/FilterPlans.tsx +126 -0
- package/src/components/Plan/PlanForm/PlanForm.tsx +7 -1
- package/src/components/Plan/PlanIntegrity/PlanIntegrity.module.scss +19 -0
- package/src/components/Plan/PlanIntegrity/PlanIntegrity.tsx +40 -3
- package/src/components/Plan/PlanItems/PlanItem.tsx +1 -1
- package/src/components/Plan/PlanRepair/PlanRepair.module.scss +53 -0
- package/src/components/Plan/PlanRepair/PlanRepair.tsx +243 -0
- package/src/components/Plan/PlanSettings/PlanAdvancedSettings.tsx +6 -2
- package/src/components/Plan/PlanSettings/PlanGeneralSettings.tsx +14 -2
- package/src/components/Plan/PlanSettings/PlanPerformanceSettings.tsx +2 -2
- package/src/components/Plan/PlanSettings/PlanSettings.module.scss +8 -0
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.module.scss +76 -0
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.tsx +166 -0
- package/src/components/Plan/PlanStats/PlanStats.module.scss +16 -2
- package/src/components/Plan/PlanStats/PlanStats.tsx +8 -11
- package/src/components/common/FileManager/FileManager.module.scss +7 -0
- package/src/components/common/Icon/Icon.tsx +21 -0
- package/src/components/common/SortItems/SortItems.module.scss +3 -2
- package/src/components/common/SortItems/SortItems.tsx +6 -3
- package/src/components/common/form/MultiSelect/MultiSelect.module.scss +1 -0
- package/src/components/index.ts +2 -0
- package/src/hooks/usePlanSingleActions.tsx +26 -23
- package/src/routes/Login/Login.tsx +8 -2
- package/src/routes/PlanSingle/PlanSingle.tsx +17 -0
- package/src/routes/Plans/Plans.tsx +70 -35
- package/src/services/plans.ts +40 -4
- package/src/utils/helpers.ts +25 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanIntegrity.js","sources":["../../../../src/components/Plan/PlanIntegrity/PlanIntegrity.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport classes from './PlanIntegrity.module.scss';\r\nimport { useCheckPlanIntegrity } from '../../../services';\r\nimport { Plan, PlanReplicationStorage, PlanVerifiedResult } from '../../../@types';\r\nimport { formatDateTime, timeAgo } from '../../../utils';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\n\r\ninterface PlanIntegrityProps {\r\n planId: string;\r\n taskPending: boolean;\r\n verificationData: Plan['verified'];\r\n storage: { name: string; type: string; id: string };\r\n replicationStorages: PlanReplicationStorage[];\r\n onClose: () => void;\r\n}\r\n\r\nconst PlanIntegrity = ({ planId, taskPending, verificationData, storage, replicationStorages = [], onClose }: PlanIntegrityProps) => {\r\n const [showContent, setShowContent] = useState('primary');\r\n const integrityCheckMutation = useCheckPlanIntegrity();\r\n\r\n const integrityResultLoaded = verificationData && verificationData?.result;\r\n const hasReplications = replicationStorages && replicationStorages.length > 0;\r\n\r\n const getBackupResultByStorage = (storageType: string): PlanVerifiedResult | null => {\r\n if (!verificationData?.result) return null;\r\n\r\n const replicationResult = verificationData.result as Record<string, PlanVerifiedResult>;\r\n return replicationResult[storageType] ?? null;\r\n };\r\n\r\n const renderLogs = (storageType: string) => {\r\n if (integrityCheckMutation.isPending) return null;\r\n const backupResData = getBackupResultByStorage(storageType);\r\n const messages = backupResData?.logs;\r\n if (!messages?.length) return null;\r\n\r\n return (\r\n <div className={classes.integrityLogs}>\r\n <div className={classes.integrityLogsHeader}>\r\n <div>Integrity Check Output Logs</div>\r\n <div title={formatDateTime(verificationData.endedAt || verificationData.startedAt)}>\r\n <Icon type=\"clock\" size={14} /> {timeAgo(new Date(verificationData.endedAt || verificationData.startedAt))}\r\n </div>\r\n </div>\r\n <div className={classes.integrityLogMessages}>\r\n {messages.map((message, index) => (\r\n <span key={index}>{message}</span>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderBackupFixSuggestion = (storageType: string) => {\r\n if (!integrityResultLoaded) return null;\r\n if (integrityCheckMutation.isPending) return null;\r\n const backupResData = getBackupResultByStorage(storageType);\r\n if (!backupResData?.hasError) return null;\r\n\r\n return (\r\n <div className={classes.fixSuggestion}>\r\n <h4>Fix Suggestion</h4>\r\n <div className={classes.fixSuggestionContent}>\r\n {backupResData.fix &&\r\n backupResData.fix\r\n .split('\\n')\r\n .map((line, index) => <p key={index}>{line.includes('`') ? <code>{line.replace(/`/g, '')}</code> : line}</p>)}\r\n {!backupResData.fix && <p>No Suggestion for this issue.</p>}\r\n <p>\r\n Learn more about fixing restic repo issues{' '}\r\n <a\r\n href=\"https://restic.readthedocs.io/en/latest/077_troubleshooting.html#find-out-what-is-damaged\"\r\n target=\"_blank\"\r\n rel=\"noreferrer\"\r\n >\r\n here.\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderBackupStatus = (storageType: string) => {\r\n if (!integrityResultLoaded) return null;\r\n if (integrityCheckMutation.isPending) return null;\r\n const backupResData = getBackupResultByStorage(storageType);\r\n const backupHasError = backupResData?.hasError;\r\n const backupMessage = backupResData?.message;\r\n\r\n if (!backupHasError && backupMessage?.includes('No Issue Detected')) {\r\n return <div className=\"label success\">🥳 Yoohoo! No Corruption or Bit rot found. Your backup snapshots are completely restorable.</div>;\r\n }\r\n\r\n return <div className=\"label error\">⛔ Error Found. {backupMessage}</div>;\r\n };\r\n\r\n const renderResultWithReplications = () => {\r\n return (\r\n <div className={`${classes.integrityResult} ${classes.withReplications}`}>\r\n {verificationData &&\r\n Object.entries(verificationData.result as Record<string, PlanVerifiedResult>).map(([storageType]) => {\r\n let theStorage = storage;\r\n if (storageType !== 'primary') {\r\n const mirror = replicationStorages.find((s) => s.storageId === storageType.replace('mirror_', ''));\r\n if (mirror) {\r\n theStorage = { name: mirror.storageName as string, type: mirror?.storageType as string, id: mirror?.storageId as string };\r\n }\r\n }\r\n if (!theStorage) return null;\r\n const backupResData = getBackupResultByStorage(storageType);\r\n const backupHasError = backupResData?.hasError;\r\n return (\r\n <div key={storageType} className={classes.replicationResult}>\r\n <h4 onClick={() => setShowContent(storageType)} className={showContent === storageType ? classes.active : ''}>\r\n <span>\r\n <img src={`/providers/${theStorage.type}.png`} />\r\n {theStorage.name} <i>{storageType === 'primary' ? 'Primary' : `Mirror`}</i>\r\n </span>\r\n <span>\r\n {backupHasError ? (\r\n <Icon type=\"error-circle-filled\" size={14} color=\"#ff4d4f\" />\r\n ) : (\r\n <Icon type=\"check-circle-filled\" size={14} color=\"#06ba9f\" />\r\n )}\r\n </span>\r\n </h4>\r\n {showContent === storageType && (\r\n <div className={classes.replicationResultContent}>\r\n {renderBackupStatus(storageType)}\r\n {renderLogs(storageType)}\r\n {renderBackupFixSuggestion(storageType)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <ActionModal\r\n title=\"Check Backup Integrity\"\r\n message={\r\n <div className={classes.integrityMessage}>\r\n {!integrityResultLoaded && <p>Check the integrity of the backup snapshots now to check if they are restorable?</p>}\r\n {integrityResultLoaded && (\r\n <div>\r\n {!hasReplications ? (\r\n <div className={classes.integrityResult}>\r\n {renderBackupStatus('primary')}\r\n {renderLogs('primary')}\r\n {renderBackupFixSuggestion('primary')}\r\n </div>\r\n ) : (\r\n renderResultWithReplications()\r\n )}\r\n </div>\r\n )}\r\n {integrityCheckMutation.isPending && (\r\n <div className=\"label in_progress\">\r\n <Icon type=\"loading\" size={14} />\r\n Checking integrity...\r\n </div>\r\n )}\r\n </div>\r\n }\r\n errorMessage={integrityCheckMutation.error?.message}\r\n closeModal={() => onClose()}\r\n width=\"600px\"\r\n primaryAction={{\r\n title: integrityResultLoaded ? 'Check Again' : 'Check Now',\r\n type: 'default',\r\n isPending: integrityCheckMutation.isPending,\r\n action: () => !taskPending && integrityCheckMutation.mutate({ planId }),\r\n }}\r\n secondaryAction={{\r\n title: 'Close',\r\n action: () => onClose(),\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default PlanIntegrity;\r\n"],"names":["PlanIntegrity","planId","taskPending","verificationData","storage","replicationStorages","onClose","showContent","setShowContent","useState","integrityCheckMutation","useCheckPlanIntegrity","integrityResultLoaded","hasReplications","getBackupResultByStorage","storageType","renderLogs","backupResData","messages","jsxs","classes","jsx","formatDateTime","Icon","timeAgo","message","index","renderBackupFixSuggestion","line","renderBackupStatus","backupHasError","backupMessage","renderResultWithReplications","theStorage","mirror","s","ActionModal","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlanIntegrity.js","sources":["../../../../src/components/Plan/PlanIntegrity/PlanIntegrity.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport classes from './PlanIntegrity.module.scss';\r\nimport { useCheckPlanIntegrity } from '../../../services';\r\nimport { Plan, PlanReplicationStorage, PlanVerifiedResult } from '../../../@types';\r\nimport { formatDateTime, timeAgo } from '../../../utils';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\n\r\ninterface PlanIntegrityProps {\r\n planId: string;\r\n taskPending: boolean;\r\n verificationData: Plan['verified'];\r\n storage: { name: string; type: string; id: string };\r\n replicationStorages: PlanReplicationStorage[];\r\n onClose: () => void;\r\n onRepairOpen: (replicationId: string) => void;\r\n}\r\n\r\nconst PlanIntegrity = ({ planId, taskPending, verificationData, storage, replicationStorages = [], onClose, onRepairOpen }: PlanIntegrityProps) => {\r\n const [showContent, setShowContent] = useState('primary');\r\n const integrityCheckMutation = useCheckPlanIntegrity();\r\n\r\n const integrityResultLoaded = verificationData && verificationData?.result;\r\n const hasReplications = replicationStorages && replicationStorages.length > 0;\r\n\r\n const getBackupResultByStorage = (storageType: string): PlanVerifiedResult | null => {\r\n if (!verificationData?.result) return null;\r\n\r\n const replicationResult = verificationData.result as Record<string, PlanVerifiedResult>;\r\n return replicationResult[storageType] ?? null;\r\n };\r\n\r\n const renderLogs = (storageType: string) => {\r\n if (integrityCheckMutation.isPending) return null;\r\n const backupResData = getBackupResultByStorage(storageType);\r\n const messages = backupResData?.logs;\r\n if (!messages?.length) return null;\r\n\r\n return (\r\n <div className={classes.integrityLogs}>\r\n <div className={classes.integrityLogsHeader}>\r\n <div>Integrity Check Output Logs</div>\r\n <div title={formatDateTime(verificationData.endedAt || verificationData.startedAt)}>\r\n <Icon type=\"clock\" size={14} /> {timeAgo(new Date(verificationData.endedAt || verificationData.startedAt))}\r\n </div>\r\n </div>\r\n <div className={classes.integrityLogMessages}>\r\n {messages.map((message, index) => (\r\n <span key={index}>{message}</span>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderBackupFixSuggestion = (storageType: string) => {\r\n if (!integrityResultLoaded) return null;\r\n if (integrityCheckMutation.isPending) return null;\r\n const backupResData = getBackupResultByStorage(storageType);\r\n if (!backupResData?.hasError) return null;\r\n\r\n return (\r\n <div className={classes.fixSuggestion}>\r\n <h4>Fix Suggestion</h4>\r\n <div className={classes.fixSuggestionContent}>\r\n {backupResData.fix &&\r\n backupResData.fix\r\n .split('\\n')\r\n .map((line, index) => <p key={index}>{line.includes('`') ? <code>{line.replace(/`/g, '')}</code> : line}</p>)}\r\n {!backupResData.fix && <p>No Suggestion for this issue.</p>}\r\n {(backupResData.errorType === 'pack_file_error' || backupResData.errorType === 'index_error') && (\r\n <p>\r\n <button onClick={() => onRepairOpen(storageType)}>Open Repo Repair</button> Window for more options.\r\n </p>\r\n )}\r\n <p>\r\n Learn more about fixing restic repo issues{' '}\r\n <a\r\n href=\"https://restic.readthedocs.io/en/latest/077_troubleshooting.html#find-out-what-is-damaged\"\r\n target=\"_blank\"\r\n rel=\"noreferrer\"\r\n >\r\n here.\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n const renderBackupStatus = (storageType: string) => {\r\n if (!integrityResultLoaded) return null;\r\n if (integrityCheckMutation.isPending) return null;\r\n const backupResData = getBackupResultByStorage(storageType);\r\n const backupHasError = backupResData?.hasError;\r\n const backupMessage = backupResData?.message;\r\n\r\n if (!backupHasError && backupMessage?.includes('No Issue Detected')) {\r\n return <div className=\"label success\">🥳 Yoohoo! No Corruption or Bit rot found. Your backup snapshots are completely restorable.</div>;\r\n }\r\n\r\n return <div className=\"label error\">⛔ Error Found. {backupMessage}</div>;\r\n };\r\n\r\n const renderRepairContent = (storageType: string) => {\r\n const backupResData = getBackupResultByStorage(storageType);\r\n return (\r\n <div className={classes.repairBox}>\r\n {(backupResData?.errorType === 'pack_file_error' || backupResData?.errorType === 'repairable_pack_file_error') && (\r\n <div>\r\n Some pack files in the repository are either damaged or missing and can be repaired.{' '}\r\n <button onClick={() => onRepairOpen(storageType)}>\r\n <Icon type=\"repair\" size={13} /> Open Repo Repair Tool\r\n </button>\r\n </div>\r\n )}\r\n {backupResData?.errorType === 'index_error' && (\r\n <div>\r\n The index files in the repository are corrupted and can be repaired.{' '}\r\n <button onClick={() => onRepairOpen(storageType)}>\r\n <Icon type=\"repair\" size={13} /> Open Repo Repair Tool\r\n </button>{' '}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n const renderRepairOrFixSuggestion = (storageType: string) => {\r\n const backupResData = getBackupResultByStorage(storageType);\r\n const errorType = backupResData?.errorType;\r\n const isRepairable = errorType === 'pack_file_error' || errorType === 'index_error' || errorType === 'repairable_pack_file_error';\r\n return isRepairable ? renderRepairContent(storageType) : renderBackupFixSuggestion(storageType);\r\n };\r\n\r\n const renderResultWithReplications = () => {\r\n return (\r\n <div className={`${classes.integrityResult} ${classes.withReplications}`}>\r\n {verificationData &&\r\n Object.entries(verificationData.result as Record<string, PlanVerifiedResult>).map(([storageType]) => {\r\n let theStorage = storage;\r\n if (storageType !== 'primary') {\r\n const mirror = replicationStorages.find((s) => s.storageId === storageType.replace('mirror_', ''));\r\n if (mirror) {\r\n theStorage = { name: mirror.storageName as string, type: mirror?.storageType as string, id: mirror?.storageId as string };\r\n }\r\n }\r\n if (!theStorage) return null;\r\n const backupResData = getBackupResultByStorage(storageType);\r\n const backupHasError = backupResData?.hasError;\r\n return (\r\n <div key={storageType} className={classes.replicationResult}>\r\n <h4 onClick={() => setShowContent(storageType)} className={showContent === storageType ? classes.active : ''}>\r\n <span>\r\n <img src={`/providers/${theStorage.type}.png`} />\r\n {theStorage.name} <i>{storageType === 'primary' ? 'Primary' : `Mirror`}</i>\r\n </span>\r\n <span>\r\n {backupHasError ? (\r\n <Icon type=\"error-circle-filled\" size={14} color=\"#ff4d4f\" />\r\n ) : (\r\n <Icon type=\"check-circle-filled\" size={14} color=\"#06ba9f\" />\r\n )}\r\n </span>\r\n </h4>\r\n {showContent === storageType && (\r\n <div className={classes.replicationResultContent}>\r\n {renderBackupStatus(storageType)}\r\n {renderLogs(storageType)}\r\n {renderRepairOrFixSuggestion(storageType)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <ActionModal\r\n title=\"Check Backup Integrity\"\r\n message={\r\n <div className={classes.integrityMessage}>\r\n {!integrityResultLoaded && <p>Check the integrity of the backup snapshots now to check if they are restorable?</p>}\r\n {integrityResultLoaded && (\r\n <div>\r\n {!hasReplications ? (\r\n <div className={classes.integrityResult}>\r\n {renderBackupStatus('primary')}\r\n {renderLogs('primary')}\r\n {renderRepairOrFixSuggestion('primary')}\r\n </div>\r\n ) : (\r\n renderResultWithReplications()\r\n )}\r\n </div>\r\n )}\r\n {integrityCheckMutation.isPending && (\r\n <div className=\"label in_progress\">\r\n <Icon type=\"loading\" size={14} />\r\n Checking integrity...\r\n </div>\r\n )}\r\n </div>\r\n }\r\n errorMessage={integrityCheckMutation.error?.message}\r\n closeModal={() => onClose()}\r\n width=\"600px\"\r\n primaryAction={{\r\n title: integrityResultLoaded ? 'Check Again' : 'Check Now',\r\n type: 'default',\r\n isPending: integrityCheckMutation.isPending,\r\n action: () => !taskPending && integrityCheckMutation.mutate({ planId }),\r\n }}\r\n secondaryAction={{\r\n title: 'Close',\r\n action: () => onClose(),\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default PlanIntegrity;\r\n"],"names":["PlanIntegrity","planId","taskPending","verificationData","storage","replicationStorages","onClose","onRepairOpen","showContent","setShowContent","useState","integrityCheckMutation","useCheckPlanIntegrity","integrityResultLoaded","hasReplications","getBackupResultByStorage","storageType","renderLogs","backupResData","messages","jsxs","classes","jsx","formatDateTime","Icon","timeAgo","message","index","renderBackupFixSuggestion","line","renderBackupStatus","backupHasError","backupMessage","renderRepairContent","renderRepairOrFixSuggestion","errorType","renderResultWithReplications","theStorage","mirror","s","ActionModal","_a"],"mappings":"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"}
|
|
@@ -1,26 +1,28 @@
|
|
|
1
|
-
const t = "
|
|
1
|
+
const t = "_integrityMessage_dogTD", e = "_fixSuggestion_MjS49", i = "_fixSuggestionContent_PBRHR", s = "_integrityLogs_sFn3V", n = "_integrityLogsHeader_yCpKx", o = "_integrityLogMessages_1Q8xP", g = "_integrityResult_CxhZb", r = "_withReplications_b0Nz8", a = "_replicationResult_yYpRF", c = "_replicationResultContent_5924x", _ = "_repairBox_jbBii", l = {
|
|
2
2
|
integrityMessage: t,
|
|
3
3
|
fixSuggestion: e,
|
|
4
4
|
fixSuggestionContent: i,
|
|
5
5
|
integrityLogs: s,
|
|
6
6
|
integrityLogsHeader: n,
|
|
7
|
-
integrityLogMessages:
|
|
8
|
-
integrityResult:
|
|
7
|
+
integrityLogMessages: o,
|
|
8
|
+
integrityResult: g,
|
|
9
9
|
withReplications: r,
|
|
10
|
-
replicationResult:
|
|
11
|
-
replicationResultContent:
|
|
10
|
+
replicationResult: a,
|
|
11
|
+
replicationResultContent: c,
|
|
12
|
+
repairBox: _
|
|
12
13
|
};
|
|
13
14
|
export {
|
|
14
15
|
l as default,
|
|
15
16
|
e as fixSuggestion,
|
|
16
17
|
i as fixSuggestionContent,
|
|
17
|
-
|
|
18
|
+
o as integrityLogMessages,
|
|
18
19
|
s as integrityLogs,
|
|
19
20
|
n as integrityLogsHeader,
|
|
20
21
|
t as integrityMessage,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
a as
|
|
22
|
+
g as integrityResult,
|
|
23
|
+
_ as repairBox,
|
|
24
|
+
a as replicationResult,
|
|
25
|
+
c as replicationResultContent,
|
|
24
26
|
r as withReplications
|
|
25
27
|
};
|
|
26
28
|
//# sourceMappingURL=PlanIntegrity.module.scss.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanIntegrity.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PlanIntegrity.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
|
|
@@ -45,7 +45,7 @@ const st = ({ plan: u, layout: z = "list" }) => {
|
|
|
45
45
|
}));
|
|
46
46
|
}, M = () => {
|
|
47
47
|
b || (f.promise(
|
|
48
|
-
v.mutateAsync(s),
|
|
48
|
+
v.mutateAsync({ id: s }),
|
|
49
49
|
{
|
|
50
50
|
pending: `Starting ${m ? "Sync" : "Backup"}...`,
|
|
51
51
|
success: `${m ? "Sync" : "Backup"} initiated successfully! 🚀`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanItem.js","sources":["../../../../src/components/Plan/PlanItems/PlanItem.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { toast } from 'react-toastify';\r\nimport { NavLink } from 'react-router';\r\nimport { Plan } from '../../../@types/plans';\r\nimport { formatBytes, formatDateTime, timeAgo } from '../../../utils/helpers';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport classes from './PlanItem.module.scss';\r\nimport { useDeletePlan, usePausePlan, usePerformBackup, useResumePlan } from '../../../services/plans';\r\nimport { planIntervalName } from '../../../utils/plans';\r\nimport PlanHistory from '../PlanHistory/PlanHistory';\r\nimport PlanStorageInfo from '../PlanStorageInfo/PlanStorageInfo';\r\n\r\ninterface PlanItemProps {\r\n plan: Plan;\r\n layout?: 'grid' | 'list';\r\n}\r\n\r\nconst PlanItem = ({ plan, layout = 'list' }: PlanItemProps) => {\r\n const {\r\n id,\r\n title,\r\n description,\r\n sourceConfig = { includes: [], excludes: [] },\r\n settings,\r\n inProgress,\r\n lastBackupTime = '',\r\n stats,\r\n backups = [],\r\n storage,\r\n isActive = false,\r\n verified,\r\n device,\r\n method = 'backup',\r\n } = plan;\r\n\r\n const { interval = { type: 'daily', time: '10:00AM' }, encryption = false, compression = false } = settings;\r\n const [showSettings, setShowSettings] = useState(false);\r\n\r\n const deletePlanMutation = useDeletePlan();\r\n const performBackupMutation = usePerformBackup();\r\n const pauseMutation = usePausePlan();\r\n const resumeMutation = useResumePlan();\r\n const shouldBeInaccessible =\r\n pauseMutation.isPending || resumeMutation.isPending || performBackupMutation.isPending || deletePlanMutation.isPending;\r\n const isSync = method === 'sync';\r\n const changeStatus = () => {\r\n if (inProgress || shouldBeInaccessible) {\r\n return;\r\n }\r\n // isActive, set it to false, else true\r\n // When the action is being performed, the item should grey out and stay inaccessible.\r\n // When this happens, the server should stop the restic Cron schedule\r\n console.log(' changeStatus:', !isActive);\r\n if (isActive) {\r\n toast.promise(pauseMutation.mutateAsync(id), {\r\n pending: 'Pausing backup Plan...',\r\n success: 'Backup Plan Paused',\r\n error: {\r\n render({ data }: any) {\r\n return `Failed to Pause Backup Plan. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n });\r\n } else {\r\n toast.promise(resumeMutation.mutateAsync(id), {\r\n pending: 'Resuming backup Plan...',\r\n success: 'Backup Plan Resumed',\r\n error: {\r\n render({ data }: any) {\r\n return `Failed to Resume Backup Plan. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n });\r\n }\r\n };\r\n\r\n const backupNow = () => {\r\n if (shouldBeInaccessible) {\r\n return;\r\n }\r\n toast.promise(\r\n performBackupMutation.mutateAsync(id),\r\n {\r\n pending: `Starting ${isSync ? 'Sync' : 'Backup'}...`,\r\n success: `${isSync ? 'Sync' : 'Backup'} initiated successfully! 🚀`,\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to start ${isSync ? 'Sync' : 'Backup'}. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n {\r\n style: {\r\n minWidth: '250px',\r\n },\r\n },\r\n );\r\n setShowSettings(false);\r\n };\r\n\r\n return (\r\n <div\r\n key={id}\r\n className={`${classes.plan} ${layout === 'grid' ? classes.planGrid : classes.planList} ${verified && verified.hasError ? classes.planHasError : ''}`}\r\n >\r\n <div className={classes.leftContent}>\r\n <div className={`${classes.status} ${!isActive ? classes.paused : ''}`}>\r\n <Icon type={method === 'backup' ? 'plans' : 'sync'} size={28} />\r\n </div>\r\n\r\n <div className={classes.content}>\r\n <NavLink to={`/plan/${id}`}>\r\n <div className={classes.title}>\r\n <h4>{title}</h4>\r\n {description && (\r\n <i\r\n className={classes.planDescription}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-content={description}\r\n data-tooltip-place=\"top\"\r\n >\r\n <Icon type=\"note\" size={13} />\r\n </i>\r\n )}\r\n {encryption && (\r\n <i data-tooltip-id=\"appTooltip\" data-tooltip-content={`Encrypted`} data-tooltip-place=\"top\">\r\n <Icon type=\"encrypted\" size={14} />\r\n </i>\r\n )}\r\n {compression && (\r\n <i data-tooltip-id=\"appTooltip\" data-tooltip-content={`Compressed`} data-tooltip-place=\"top\">\r\n <Icon type=\"compressed\" size={14} />\r\n </i>\r\n )}\r\n {!isActive && (\r\n <i data-tooltip-id=\"appTooltip\" data-tooltip-content={`Plan Paused`} data-tooltip-place=\"top\">\r\n <Icon type=\"pause\" size={14} />\r\n </i>\r\n )}\r\n {verified && verified.hasError && (\r\n <i data-tooltip-id=\"appTooltip\" data-tooltip-content={`Plan Has Error`} data-tooltip-place=\"top\">\r\n <Icon size={14} type={'error-circle-filled'} color=\"#dd6b6b\" />\r\n </i>\r\n )}\r\n </div>\r\n <div className={classes.sources}>\r\n <span\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-html={sourceConfig?.includes ? sourceConfig.includes.map((p) => `<div>${p}</div>`).join('') : ''}\r\n >\r\n {device?.name && (\r\n <>\r\n <Icon type={device.id === 'main' ? 'computer' : 'computer-remote'} size={13} /> {device.name}\r\n </>\r\n )}\r\n <span className={classes.sourceCount}>{sourceConfig.includes.length}</span>\r\n </span>{' '}\r\n {'-->'}\r\n <PlanStorageInfo replicationSettings={plan.settings.replication} storage={storage} storagePath={plan.storagePath} />\r\n </div>\r\n </NavLink>\r\n </div>\r\n </div>\r\n <div className={classes.rightContent}>\r\n <div\r\n className={classes.size}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-hidden={!stats.snapshots || method === 'sync'}\r\n data-tooltip-content={`Total Snapshots: ${stats.snapshots.length}`}\r\n >\r\n <Icon type=\"disk\" size={14} /> <i>{formatBytes(stats.size)}</i>\r\n </div>\r\n <div className={classes.interval}>\r\n <Icon type=\"interval\" size={14} /> <i>{planIntervalName(interval)}</i>\r\n </div>\r\n <div\r\n className={classes.time}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-content={lastBackupTime ? `Last backed up on ${formatDateTime(lastBackupTime as string)}` : \"Hasn't been backed up yet\"}\r\n data-tooltip-place=\"top\"\r\n data-tooltip-hidden={inProgress}\r\n >\r\n <Icon type={inProgress ? 'loading' : 'clock'} size={14} />{' '}\r\n {inProgress ? 'In Progress' : lastBackupTime ? timeAgo(new Date(lastBackupTime as string)) : 'Not Yet'}\r\n </div>\r\n <PlanHistory planId={id} history={backups} />\r\n <button className={`${classes.moreBtn} ${showSettings ? classes.moreBtnActive : ''}`} onClick={() => setShowSettings(!showSettings)}>\r\n <Icon type=\"dots-vertical\" size={14} />\r\n </button>\r\n </div>\r\n {showSettings && (\r\n <div className={classes.settings}>\r\n <button onClick={backupNow}>\r\n <Icon type=\"backup\" size={14} /> {isSync ? 'Sync' : 'Backup'} Now\r\n </button>\r\n <button\r\n onClick={() => {\r\n changeStatus();\r\n setShowSettings(false);\r\n }}\r\n >\r\n <Icon type={isActive ? 'pause' : 'resume'} size={14} /> {isActive ? 'Pause Plan' : 'Resume Plan'}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanItem;\r\n"],"names":["PlanItem","plan","layout","id","title","description","sourceConfig","settings","inProgress","lastBackupTime","stats","backups","storage","isActive","verified","device","method","interval","encryption","compression","showSettings","setShowSettings","useState","deletePlanMutation","useDeletePlan","performBackupMutation","usePerformBackup","pauseMutation","usePausePlan","resumeMutation","useResumePlan","shouldBeInaccessible","isSync","changeStatus","toast","data","backupNow","jsxs","classes","jsx","Icon","NavLink","p","Fragment","PlanStorageInfo","formatBytes","planIntervalName","formatDateTime","timeAgo","PlanHistory"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlanItem.js","sources":["../../../../src/components/Plan/PlanItems/PlanItem.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { toast } from 'react-toastify';\r\nimport { NavLink } from 'react-router';\r\nimport { Plan } from '../../../@types/plans';\r\nimport { formatBytes, formatDateTime, timeAgo } from '../../../utils/helpers';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport classes from './PlanItem.module.scss';\r\nimport { useDeletePlan, usePausePlan, usePerformBackup, useResumePlan } from '../../../services/plans';\r\nimport { planIntervalName } from '../../../utils/plans';\r\nimport PlanHistory from '../PlanHistory/PlanHistory';\r\nimport PlanStorageInfo from '../PlanStorageInfo/PlanStorageInfo';\r\n\r\ninterface PlanItemProps {\r\n plan: Plan;\r\n layout?: 'grid' | 'list';\r\n}\r\n\r\nconst PlanItem = ({ plan, layout = 'list' }: PlanItemProps) => {\r\n const {\r\n id,\r\n title,\r\n description,\r\n sourceConfig = { includes: [], excludes: [] },\r\n settings,\r\n inProgress,\r\n lastBackupTime = '',\r\n stats,\r\n backups = [],\r\n storage,\r\n isActive = false,\r\n verified,\r\n device,\r\n method = 'backup',\r\n } = plan;\r\n\r\n const { interval = { type: 'daily', time: '10:00AM' }, encryption = false, compression = false } = settings;\r\n const [showSettings, setShowSettings] = useState(false);\r\n\r\n const deletePlanMutation = useDeletePlan();\r\n const performBackupMutation = usePerformBackup();\r\n const pauseMutation = usePausePlan();\r\n const resumeMutation = useResumePlan();\r\n const shouldBeInaccessible =\r\n pauseMutation.isPending || resumeMutation.isPending || performBackupMutation.isPending || deletePlanMutation.isPending;\r\n const isSync = method === 'sync';\r\n const changeStatus = () => {\r\n if (inProgress || shouldBeInaccessible) {\r\n return;\r\n }\r\n // isActive, set it to false, else true\r\n // When the action is being performed, the item should grey out and stay inaccessible.\r\n // When this happens, the server should stop the restic Cron schedule\r\n console.log(' changeStatus:', !isActive);\r\n if (isActive) {\r\n toast.promise(pauseMutation.mutateAsync(id), {\r\n pending: 'Pausing backup Plan...',\r\n success: 'Backup Plan Paused',\r\n error: {\r\n render({ data }: any) {\r\n return `Failed to Pause Backup Plan. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n });\r\n } else {\r\n toast.promise(resumeMutation.mutateAsync(id), {\r\n pending: 'Resuming backup Plan...',\r\n success: 'Backup Plan Resumed',\r\n error: {\r\n render({ data }: any) {\r\n return `Failed to Resume Backup Plan. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n });\r\n }\r\n };\r\n\r\n const backupNow = () => {\r\n if (shouldBeInaccessible) {\r\n return;\r\n }\r\n toast.promise(\r\n performBackupMutation.mutateAsync({ id }),\r\n {\r\n pending: `Starting ${isSync ? 'Sync' : 'Backup'}...`,\r\n success: `${isSync ? 'Sync' : 'Backup'} initiated successfully! 🚀`,\r\n error: {\r\n render({ data }: any) {\r\n // When the promise reject, data will contains the error\r\n return `Failed to start ${isSync ? 'Sync' : 'Backup'}. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n {\r\n style: {\r\n minWidth: '250px',\r\n },\r\n },\r\n );\r\n setShowSettings(false);\r\n };\r\n\r\n return (\r\n <div\r\n key={id}\r\n className={`${classes.plan} ${layout === 'grid' ? classes.planGrid : classes.planList} ${verified && verified.hasError ? classes.planHasError : ''}`}\r\n >\r\n <div className={classes.leftContent}>\r\n <div className={`${classes.status} ${!isActive ? classes.paused : ''}`}>\r\n <Icon type={method === 'backup' ? 'plans' : 'sync'} size={28} />\r\n </div>\r\n\r\n <div className={classes.content}>\r\n <NavLink to={`/plan/${id}`}>\r\n <div className={classes.title}>\r\n <h4>{title}</h4>\r\n {description && (\r\n <i\r\n className={classes.planDescription}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-content={description}\r\n data-tooltip-place=\"top\"\r\n >\r\n <Icon type=\"note\" size={13} />\r\n </i>\r\n )}\r\n {encryption && (\r\n <i data-tooltip-id=\"appTooltip\" data-tooltip-content={`Encrypted`} data-tooltip-place=\"top\">\r\n <Icon type=\"encrypted\" size={14} />\r\n </i>\r\n )}\r\n {compression && (\r\n <i data-tooltip-id=\"appTooltip\" data-tooltip-content={`Compressed`} data-tooltip-place=\"top\">\r\n <Icon type=\"compressed\" size={14} />\r\n </i>\r\n )}\r\n {!isActive && (\r\n <i data-tooltip-id=\"appTooltip\" data-tooltip-content={`Plan Paused`} data-tooltip-place=\"top\">\r\n <Icon type=\"pause\" size={14} />\r\n </i>\r\n )}\r\n {verified && verified.hasError && (\r\n <i data-tooltip-id=\"appTooltip\" data-tooltip-content={`Plan Has Error`} data-tooltip-place=\"top\">\r\n <Icon size={14} type={'error-circle-filled'} color=\"#dd6b6b\" />\r\n </i>\r\n )}\r\n </div>\r\n <div className={classes.sources}>\r\n <span\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-html={sourceConfig?.includes ? sourceConfig.includes.map((p) => `<div>${p}</div>`).join('') : ''}\r\n >\r\n {device?.name && (\r\n <>\r\n <Icon type={device.id === 'main' ? 'computer' : 'computer-remote'} size={13} /> {device.name}\r\n </>\r\n )}\r\n <span className={classes.sourceCount}>{sourceConfig.includes.length}</span>\r\n </span>{' '}\r\n {'-->'}\r\n <PlanStorageInfo replicationSettings={plan.settings.replication} storage={storage} storagePath={plan.storagePath} />\r\n </div>\r\n </NavLink>\r\n </div>\r\n </div>\r\n <div className={classes.rightContent}>\r\n <div\r\n className={classes.size}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-hidden={!stats.snapshots || method === 'sync'}\r\n data-tooltip-content={`Total Snapshots: ${stats.snapshots.length}`}\r\n >\r\n <Icon type=\"disk\" size={14} /> <i>{formatBytes(stats.size)}</i>\r\n </div>\r\n <div className={classes.interval}>\r\n <Icon type=\"interval\" size={14} /> <i>{planIntervalName(interval)}</i>\r\n </div>\r\n <div\r\n className={classes.time}\r\n data-tooltip-id=\"appTooltip\"\r\n data-tooltip-content={lastBackupTime ? `Last backed up on ${formatDateTime(lastBackupTime as string)}` : \"Hasn't been backed up yet\"}\r\n data-tooltip-place=\"top\"\r\n data-tooltip-hidden={inProgress}\r\n >\r\n <Icon type={inProgress ? 'loading' : 'clock'} size={14} />{' '}\r\n {inProgress ? 'In Progress' : lastBackupTime ? timeAgo(new Date(lastBackupTime as string)) : 'Not Yet'}\r\n </div>\r\n <PlanHistory planId={id} history={backups} />\r\n <button className={`${classes.moreBtn} ${showSettings ? classes.moreBtnActive : ''}`} onClick={() => setShowSettings(!showSettings)}>\r\n <Icon type=\"dots-vertical\" size={14} />\r\n </button>\r\n </div>\r\n {showSettings && (\r\n <div className={classes.settings}>\r\n <button onClick={backupNow}>\r\n <Icon type=\"backup\" size={14} /> {isSync ? 'Sync' : 'Backup'} Now\r\n </button>\r\n <button\r\n onClick={() => {\r\n changeStatus();\r\n setShowSettings(false);\r\n }}\r\n >\r\n <Icon type={isActive ? 'pause' : 'resume'} size={14} /> {isActive ? 'Pause Plan' : 'Resume Plan'}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanItem;\r\n"],"names":["PlanItem","plan","layout","id","title","description","sourceConfig","settings","inProgress","lastBackupTime","stats","backups","storage","isActive","verified","device","method","interval","encryption","compression","showSettings","setShowSettings","useState","deletePlanMutation","useDeletePlan","performBackupMutation","usePerformBackup","pauseMutation","usePausePlan","resumeMutation","useResumePlan","shouldBeInaccessible","isSync","changeStatus","toast","data","backupNow","jsxs","classes","jsx","Icon","NavLink","p","Fragment","PlanStorageInfo","formatBytes","planIntervalName","formatDateTime","timeAgo","PlanHistory"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface PlanRepairProps {
|
|
2
|
+
planId: string;
|
|
3
|
+
errorType: string;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onOpenIntegrity: () => void;
|
|
6
|
+
}
|
|
7
|
+
declare const PlanRepair: ({ planId, errorType, onClose, onOpenIntegrity }: PlanRepairProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default PlanRepair;
|
|
9
|
+
//# sourceMappingURL=PlanRepair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanRepair.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanRepair/PlanRepair.tsx"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,eAAe,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,QAAA,MAAM,UAAU,GAAI,iDAAiD,eAAe,4CAmOnF,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { jsx as e, jsxs as n } from "react/jsx-runtime";
|
|
2
|
+
import { toast as l } from "react-toastify";
|
|
3
|
+
import { usePausePlan as x, useResumePlan as S, usePerformBackup as z, useRepairBackupPlan as B } from "../../../services/plans.js";
|
|
4
|
+
import r from "../../common/Icon/Icon.js";
|
|
5
|
+
import v from "../../common/SidePanel/SidePanel.js";
|
|
6
|
+
import s from "./PlanRepair.module.scss.js";
|
|
7
|
+
const $ = ({ planId: a, errorType: p, onClose: f, onOpenIntegrity: c }) => {
|
|
8
|
+
const k = x(), g = S(), m = z(), b = B(), i = k.isPending || g.isPending || m.isPending || b.isPending, d = () => {
|
|
9
|
+
l.promise(
|
|
10
|
+
k.mutateAsync(a),
|
|
11
|
+
{
|
|
12
|
+
pending: "Pausing backup Plan...",
|
|
13
|
+
success: "Backup Plan Paused",
|
|
14
|
+
error: {
|
|
15
|
+
render({ data: t }) {
|
|
16
|
+
return `Failed to Pause Backup Plan. ${(t == null ? void 0 : t.message) || "Unknown Error."}`;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
{ autoClose: 3e3 }
|
|
21
|
+
);
|
|
22
|
+
}, h = () => {
|
|
23
|
+
l.promise(
|
|
24
|
+
g.mutateAsync(a),
|
|
25
|
+
{
|
|
26
|
+
pending: "Resuming backup Plan...",
|
|
27
|
+
success: "Backup Plan Resumed",
|
|
28
|
+
error: {
|
|
29
|
+
render({ data: t }) {
|
|
30
|
+
return `Failed to Resume Backup Plan. ${(t == null ? void 0 : t.message) || "Unknown Error."}`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{ autoClose: 3e3 }
|
|
35
|
+
);
|
|
36
|
+
}, y = () => {
|
|
37
|
+
l.promise(m.mutateAsync({ id: a, runConfig: { ignoreErrors: !0, skipPrune: !0 } }), {
|
|
38
|
+
pending: "Running backup...",
|
|
39
|
+
success: "Backup Started!",
|
|
40
|
+
error: {
|
|
41
|
+
render({ data: t }) {
|
|
42
|
+
return `Failed to Start Backup. ${(t == null ? void 0 : t.message) || "Unknown Error."}`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}, o = (t) => {
|
|
47
|
+
l.promise(b.mutateAsync({ planId: a, type: t }), {
|
|
48
|
+
pending: `Repairing broken ${t}...`,
|
|
49
|
+
success: `Successfully repaired broken ${t}.`,
|
|
50
|
+
error: {
|
|
51
|
+
render({ data: u }) {
|
|
52
|
+
return `Failed to repair broken ${t}. ${(u == null ? void 0 : u.message) || "Unknown Error."}`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}, C = () => /* @__PURE__ */ n("div", { className: s.repairContent, children: [
|
|
57
|
+
/* @__PURE__ */ e("p", { className: s.repairTitle, children: "Fixing Restic Repo with Damaged or Missing Packs" }),
|
|
58
|
+
/* @__PURE__ */ n("p", { children: [
|
|
59
|
+
/* @__PURE__ */ e("strong", { children: "Step 1: " }),
|
|
60
|
+
" First,",
|
|
61
|
+
" ",
|
|
62
|
+
/* @__PURE__ */ n("button", { onClick: d, disabled: i, children: [
|
|
63
|
+
/* @__PURE__ */ e(r, { type: "pause", size: 12 }),
|
|
64
|
+
" Pause"
|
|
65
|
+
] }),
|
|
66
|
+
" ",
|
|
67
|
+
"the backup plan to prevent any new backup runs from starting."
|
|
68
|
+
] }),
|
|
69
|
+
/* @__PURE__ */ n("p", { children: [
|
|
70
|
+
/* @__PURE__ */ e("strong", { children: "Step 2: " }),
|
|
71
|
+
" Download/Backup the index and the snapshots directories from the destination storage."
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ n("p", { children: [
|
|
74
|
+
/* @__PURE__ */ e("strong", { children: "Step 3: " }),
|
|
75
|
+
" Then",
|
|
76
|
+
" ",
|
|
77
|
+
/* @__PURE__ */ n("button", { onClick: () => o("index"), disabled: i, children: [
|
|
78
|
+
/* @__PURE__ */ e(r, { type: "repair", size: 12 }),
|
|
79
|
+
" Repair the Repo Index"
|
|
80
|
+
] }),
|
|
81
|
+
" ",
|
|
82
|
+
"to fix missing or damaged pack files."
|
|
83
|
+
] }),
|
|
84
|
+
/* @__PURE__ */ n("p", { children: [
|
|
85
|
+
/* @__PURE__ */ e("strong", { children: "Step 4: " }),
|
|
86
|
+
" Then",
|
|
87
|
+
" ",
|
|
88
|
+
/* @__PURE__ */ n("button", { onClick: y, disabled: i, children: [
|
|
89
|
+
/* @__PURE__ */ e(r, { type: "backup", size: 13 }),
|
|
90
|
+
" Run a Backup"
|
|
91
|
+
] }),
|
|
92
|
+
" ",
|
|
93
|
+
"to update the Repo Index after repairing it."
|
|
94
|
+
] }),
|
|
95
|
+
/* @__PURE__ */ n("p", { children: [
|
|
96
|
+
/* @__PURE__ */ e("strong", { children: "Step 5: " }),
|
|
97
|
+
" Then",
|
|
98
|
+
" ",
|
|
99
|
+
/* @__PURE__ */ n("button", { onClick: c, disabled: i, children: [
|
|
100
|
+
/* @__PURE__ */ e(r, { type: "integrity", size: 12 }),
|
|
101
|
+
" Check Integrity"
|
|
102
|
+
] }),
|
|
103
|
+
" ",
|
|
104
|
+
"again to see if the repo is fixed."
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ n("p", { children: [
|
|
107
|
+
/* @__PURE__ */ e("strong", { children: "Step 6: " }),
|
|
108
|
+
" If that did not fix the issue,",
|
|
109
|
+
" ",
|
|
110
|
+
/* @__PURE__ */ n("button", { onClick: () => o("snapshots"), disabled: i, children: [
|
|
111
|
+
/* @__PURE__ */ e(r, { type: "repair", size: 12 }),
|
|
112
|
+
" Repair Broken Snapshots"
|
|
113
|
+
] }),
|
|
114
|
+
" ",
|
|
115
|
+
"and then",
|
|
116
|
+
" ",
|
|
117
|
+
/* @__PURE__ */ n("button", { onClick: c, disabled: i, children: [
|
|
118
|
+
/* @__PURE__ */ e(r, { type: "integrity", size: 12 }),
|
|
119
|
+
" Check Integrity"
|
|
120
|
+
] })
|
|
121
|
+
] }),
|
|
122
|
+
/* @__PURE__ */ n("p", { children: [
|
|
123
|
+
/* @__PURE__ */ e("strong", { children: "Step 7: " }),
|
|
124
|
+
" If the issue is resolved,",
|
|
125
|
+
" ",
|
|
126
|
+
/* @__PURE__ */ n("button", { onClick: h, disabled: i, children: [
|
|
127
|
+
/* @__PURE__ */ e(r, { type: "play", size: 12 }),
|
|
128
|
+
" Resume"
|
|
129
|
+
] }),
|
|
130
|
+
" ",
|
|
131
|
+
"the backup plan."
|
|
132
|
+
] })
|
|
133
|
+
] }), P = () => /* @__PURE__ */ n("div", { className: s.repairContent, children: [
|
|
134
|
+
/* @__PURE__ */ e("p", { className: s.repairTitle, children: "Fixing Restic Repo with Damaged Pack files" }),
|
|
135
|
+
/* @__PURE__ */ n("p", { children: [
|
|
136
|
+
/* @__PURE__ */ e("strong", { children: "Step 1: " }),
|
|
137
|
+
" First,",
|
|
138
|
+
" ",
|
|
139
|
+
/* @__PURE__ */ n("button", { onClick: d, disabled: i, children: [
|
|
140
|
+
/* @__PURE__ */ e(r, { type: "pause", size: 12 }),
|
|
141
|
+
" Pause"
|
|
142
|
+
] }),
|
|
143
|
+
" ",
|
|
144
|
+
"the backup plan to prevent any new backup runs from starting."
|
|
145
|
+
] }),
|
|
146
|
+
/* @__PURE__ */ n("p", { children: [
|
|
147
|
+
/* @__PURE__ */ e("strong", { children: "Step 2: " }),
|
|
148
|
+
" Then",
|
|
149
|
+
" ",
|
|
150
|
+
/* @__PURE__ */ n("button", { onClick: () => o("packs"), disabled: i, children: [
|
|
151
|
+
/* @__PURE__ */ e(r, { type: "repair", size: 12 }),
|
|
152
|
+
" Repair the Pack Files"
|
|
153
|
+
] }),
|
|
154
|
+
" ",
|
|
155
|
+
"to fix missing or damaged pack files."
|
|
156
|
+
] }),
|
|
157
|
+
/* @__PURE__ */ n("p", { children: [
|
|
158
|
+
/* @__PURE__ */ e("strong", { children: "Step 3: " }),
|
|
159
|
+
" Then",
|
|
160
|
+
" ",
|
|
161
|
+
/* @__PURE__ */ n("button", { onClick: () => o("snapshots"), disabled: i, children: [
|
|
162
|
+
/* @__PURE__ */ e(r, { type: "repair", size: 12 }),
|
|
163
|
+
" Repair the Snapshots"
|
|
164
|
+
] }),
|
|
165
|
+
" ",
|
|
166
|
+
"to fix the snapshots that relied on the broken pack files."
|
|
167
|
+
] }),
|
|
168
|
+
/* @__PURE__ */ n("p", { children: [
|
|
169
|
+
/* @__PURE__ */ e("strong", { children: "Step 4: " }),
|
|
170
|
+
" Then",
|
|
171
|
+
" ",
|
|
172
|
+
/* @__PURE__ */ n("button", { onClick: c, disabled: i, children: [
|
|
173
|
+
/* @__PURE__ */ e(r, { type: "integrity", size: 12 }),
|
|
174
|
+
" Check Integrity"
|
|
175
|
+
] }),
|
|
176
|
+
" ",
|
|
177
|
+
"again to see if the repo is fixed."
|
|
178
|
+
] }),
|
|
179
|
+
/* @__PURE__ */ n("p", { children: [
|
|
180
|
+
/* @__PURE__ */ e("strong", { children: "Step 5: " }),
|
|
181
|
+
" If the issue is resolved,",
|
|
182
|
+
" ",
|
|
183
|
+
/* @__PURE__ */ n("button", { onClick: h, disabled: i, children: [
|
|
184
|
+
/* @__PURE__ */ e(r, { type: "play", size: 12 }),
|
|
185
|
+
" Resume"
|
|
186
|
+
] }),
|
|
187
|
+
" ",
|
|
188
|
+
"the backup plan."
|
|
189
|
+
] })
|
|
190
|
+
] }), R = () => /* @__PURE__ */ n("div", { className: s.repairContent, children: [
|
|
191
|
+
/* @__PURE__ */ e("p", { className: s.repairTitle, children: "Fixing Restic Repo with Damaged Index" }),
|
|
192
|
+
/* @__PURE__ */ n("p", { children: [
|
|
193
|
+
/* @__PURE__ */ e("strong", { children: "Step 1: " }),
|
|
194
|
+
" First,",
|
|
195
|
+
" ",
|
|
196
|
+
/* @__PURE__ */ n("button", { onClick: d, disabled: i, children: [
|
|
197
|
+
/* @__PURE__ */ e(r, { type: "pause", size: 12 }),
|
|
198
|
+
" Pause"
|
|
199
|
+
] }),
|
|
200
|
+
" ",
|
|
201
|
+
"the backup plan to prevent any new backup runs from starting."
|
|
202
|
+
] }),
|
|
203
|
+
/* @__PURE__ */ n("p", { children: [
|
|
204
|
+
/* @__PURE__ */ e("strong", { children: "Step 2: " }),
|
|
205
|
+
" Then",
|
|
206
|
+
" ",
|
|
207
|
+
/* @__PURE__ */ n("button", { onClick: () => o("index"), disabled: i, children: [
|
|
208
|
+
/* @__PURE__ */ e(r, { type: "repair", size: 12 }),
|
|
209
|
+
" Repair the Index"
|
|
210
|
+
] }),
|
|
211
|
+
" ",
|
|
212
|
+
"to fix damaged index files."
|
|
213
|
+
] }),
|
|
214
|
+
/* @__PURE__ */ n("p", { children: [
|
|
215
|
+
/* @__PURE__ */ e("strong", { children: "Step 3: " }),
|
|
216
|
+
" Then",
|
|
217
|
+
" ",
|
|
218
|
+
/* @__PURE__ */ n("button", { onClick: c, disabled: i, children: [
|
|
219
|
+
/* @__PURE__ */ e(r, { type: "integrity", size: 12 }),
|
|
220
|
+
" Check Integrity"
|
|
221
|
+
] }),
|
|
222
|
+
" ",
|
|
223
|
+
"again to see if the repo is fixed."
|
|
224
|
+
] }),
|
|
225
|
+
/* @__PURE__ */ n("p", { children: [
|
|
226
|
+
/* @__PURE__ */ e("strong", { children: "Step 4: " }),
|
|
227
|
+
" If the issue is resolved,",
|
|
228
|
+
" ",
|
|
229
|
+
/* @__PURE__ */ n("button", { onClick: h, disabled: i, children: [
|
|
230
|
+
/* @__PURE__ */ e(r, { type: "play", size: 12 }),
|
|
231
|
+
" Resume"
|
|
232
|
+
] }),
|
|
233
|
+
" ",
|
|
234
|
+
"the backup plan."
|
|
235
|
+
] })
|
|
236
|
+
] });
|
|
237
|
+
return /* @__PURE__ */ e(
|
|
238
|
+
v,
|
|
239
|
+
{
|
|
240
|
+
title: "Check Backup Integrity",
|
|
241
|
+
icon: "integrity",
|
|
242
|
+
close: () => f(),
|
|
243
|
+
width: "800px",
|
|
244
|
+
children: /* @__PURE__ */ n("div", { className: s.repairContainer, children: [
|
|
245
|
+
i && /* @__PURE__ */ e("div", { className: s.overlay, children: /* @__PURE__ */ e(r, { type: "loading", size: 36 }) }),
|
|
246
|
+
p === "pack_file_error" && C(),
|
|
247
|
+
p === "repairable_pack_file_error" && P(),
|
|
248
|
+
p === "index_error" && R(),
|
|
249
|
+
/* @__PURE__ */ n("small", { children: [
|
|
250
|
+
"If performing the above actions does not resolve the issue, please follow this",
|
|
251
|
+
" ",
|
|
252
|
+
/* @__PURE__ */ e("a", { href: "https://restic.readthedocs.io/en/stable/077_troubleshooting.html", target: "_blank", rel: "noopener noreferrer", children: "Restic Troubleshooting Guide" }),
|
|
253
|
+
"."
|
|
254
|
+
] })
|
|
255
|
+
] })
|
|
256
|
+
}
|
|
257
|
+
);
|
|
258
|
+
};
|
|
259
|
+
export {
|
|
260
|
+
$ as default
|
|
261
|
+
};
|
|
262
|
+
//# sourceMappingURL=PlanRepair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanRepair.js","sources":["../../../../src/components/Plan/PlanRepair/PlanRepair.tsx"],"sourcesContent":["import { toast } from 'react-toastify';\r\nimport { usePausePlan, usePerformBackup, useRepairBackupPlan, useResumePlan } from '../../../services';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport SidePanel from '../../common/SidePanel/SidePanel';\r\nimport classes from './PlanRepair.module.scss';\r\n\r\ninterface PlanRepairProps {\r\n planId: string;\r\n errorType: string;\r\n onClose: () => void;\r\n onOpenIntegrity: () => void;\r\n}\r\n\r\nconst PlanRepair = ({ planId, errorType, onClose, onOpenIntegrity }: PlanRepairProps) => {\r\n const pauseMutation = usePausePlan();\r\n const resumeMutation = useResumePlan();\r\n\r\n const performBackupMutation = usePerformBackup();\r\n const repairRepoMutation = useRepairBackupPlan();\r\n\r\n const shouldBeInaccessible =\r\n pauseMutation.isPending || resumeMutation.isPending || performBackupMutation.isPending || repairRepoMutation.isPending;\r\n\r\n const pausePlan = () => {\r\n toast.promise(\r\n pauseMutation.mutateAsync(planId),\r\n {\r\n pending: 'Pausing backup Plan...',\r\n success: 'Backup Plan Paused',\r\n error: {\r\n render({ data }: any) {\r\n return `Failed to Pause Backup Plan. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n { autoClose: 3000 },\r\n );\r\n };\r\n\r\n const resumePlan = () => {\r\n toast.promise(\r\n resumeMutation.mutateAsync(planId),\r\n {\r\n pending: 'Resuming backup Plan...',\r\n success: 'Backup Plan Resumed',\r\n error: {\r\n render({ data }: any) {\r\n return `Failed to Resume Backup Plan. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n },\r\n { autoClose: 3000 },\r\n );\r\n };\r\n\r\n const runBackup = () => {\r\n toast.promise(performBackupMutation.mutateAsync({ id: planId, runConfig: { ignoreErrors: true, skipPrune: true } }), {\r\n pending: 'Running backup...',\r\n success: 'Backup Started!',\r\n error: {\r\n render({ data }: any) {\r\n return `Failed to Start Backup. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n });\r\n };\r\n\r\n const repairRepo = (type: 'index' | 'snapshots' | 'packs') => {\r\n toast.promise(repairRepoMutation.mutateAsync({ planId, type }), {\r\n pending: `Repairing broken ${type}...`,\r\n success: `Successfully repaired broken ${type}.`,\r\n error: {\r\n render({ data }: any) {\r\n return `Failed to repair broken ${type}. ${data?.message || 'Unknown Error.'}`;\r\n },\r\n },\r\n });\r\n };\r\n\r\n const renderMissingPackRepairContent = () => {\r\n return (\r\n <div className={classes.repairContent}>\r\n <p className={classes.repairTitle}>Fixing Restic Repo with Damaged or Missing Packs</p>\r\n <p>\r\n <strong>Step 1: </strong> First,{' '}\r\n <button onClick={pausePlan} disabled={shouldBeInaccessible}>\r\n <Icon type=\"pause\" size={12} /> Pause\r\n </button>{' '}\r\n the backup plan to prevent any new backup runs from starting.\r\n </p>\r\n <p>\r\n <strong>Step 2: </strong> Download/Backup the index and the snapshots directories from the destination storage.\r\n </p>\r\n <p>\r\n <strong>Step 3: </strong> Then{' '}\r\n <button onClick={() => repairRepo('index')} disabled={shouldBeInaccessible}>\r\n <Icon type=\"repair\" size={12} /> Repair the Repo Index\r\n </button>{' '}\r\n to fix missing or damaged pack files.\r\n </p>\r\n <p>\r\n <strong>Step 4: </strong> Then{' '}\r\n <button onClick={runBackup} disabled={shouldBeInaccessible}>\r\n <Icon type=\"backup\" size={13} /> Run a Backup\r\n </button>{' '}\r\n to update the Repo Index after repairing it.\r\n </p>\r\n <p>\r\n <strong>Step 5: </strong> Then{' '}\r\n <button onClick={onOpenIntegrity} disabled={shouldBeInaccessible}>\r\n <Icon type=\"integrity\" size={12} /> Check Integrity\r\n </button>{' '}\r\n again to see if the repo is fixed.\r\n </p>\r\n <p>\r\n <strong>Step 6: </strong> If that did not fix the issue,{' '}\r\n <button onClick={() => repairRepo('snapshots')} disabled={shouldBeInaccessible}>\r\n <Icon type=\"repair\" size={12} /> Repair Broken Snapshots\r\n </button>{' '}\r\n and then{' '}\r\n <button onClick={onOpenIntegrity} disabled={shouldBeInaccessible}>\r\n <Icon type=\"integrity\" size={12} /> Check Integrity\r\n </button>\r\n </p>\r\n <p>\r\n <strong>Step 7: </strong> If the issue is resolved,{' '}\r\n <button onClick={resumePlan} disabled={shouldBeInaccessible}>\r\n <Icon type=\"play\" size={12} /> Resume\r\n </button>{' '}\r\n the backup plan.\r\n </p>\r\n </div>\r\n );\r\n };\r\n const renderPackRepairContent = () => {\r\n return (\r\n <div className={classes.repairContent}>\r\n <p className={classes.repairTitle}>Fixing Restic Repo with Damaged Pack files</p>\r\n <p>\r\n <strong>Step 1: </strong> First,{' '}\r\n <button onClick={pausePlan} disabled={shouldBeInaccessible}>\r\n <Icon type=\"pause\" size={12} /> Pause\r\n </button>{' '}\r\n the backup plan to prevent any new backup runs from starting.\r\n </p>\r\n <p>\r\n <strong>Step 2: </strong> Then{' '}\r\n <button onClick={() => repairRepo('packs')} disabled={shouldBeInaccessible}>\r\n <Icon type=\"repair\" size={12} /> Repair the Pack Files\r\n </button>{' '}\r\n to fix missing or damaged pack files.\r\n </p>\r\n <p>\r\n <strong>Step 3: </strong> Then{' '}\r\n <button onClick={() => repairRepo('snapshots')} disabled={shouldBeInaccessible}>\r\n <Icon type=\"repair\" size={12} /> Repair the Snapshots\r\n </button>{' '}\r\n to fix the snapshots that relied on the broken pack files.\r\n </p>\r\n <p>\r\n <strong>Step 4: </strong> Then{' '}\r\n <button onClick={onOpenIntegrity} disabled={shouldBeInaccessible}>\r\n <Icon type=\"integrity\" size={12} /> Check Integrity\r\n </button>{' '}\r\n again to see if the repo is fixed.\r\n </p>\r\n <p>\r\n <strong>Step 5: </strong> If the issue is resolved,{' '}\r\n <button onClick={resumePlan} disabled={shouldBeInaccessible}>\r\n <Icon type=\"play\" size={12} /> Resume\r\n </button>{' '}\r\n the backup plan.\r\n </p>\r\n </div>\r\n );\r\n };\r\n\r\n const renderIndexRepairContent = () => {\r\n return (\r\n <div className={classes.repairContent}>\r\n <p className={classes.repairTitle}>Fixing Restic Repo with Damaged Index</p>\r\n <p>\r\n <strong>Step 1: </strong> First,{' '}\r\n <button onClick={pausePlan} disabled={shouldBeInaccessible}>\r\n <Icon type=\"pause\" size={12} /> Pause\r\n </button>{' '}\r\n the backup plan to prevent any new backup runs from starting.\r\n </p>\r\n <p>\r\n <strong>Step 2: </strong> Then{' '}\r\n <button onClick={() => repairRepo('index')} disabled={shouldBeInaccessible}>\r\n <Icon type=\"repair\" size={12} /> Repair the Index\r\n </button>{' '}\r\n to fix damaged index files.\r\n </p>\r\n <p>\r\n <strong>Step 3: </strong> Then{' '}\r\n <button onClick={onOpenIntegrity} disabled={shouldBeInaccessible}>\r\n <Icon type=\"integrity\" size={12} /> Check Integrity\r\n </button>{' '}\r\n again to see if the repo is fixed.\r\n </p>\r\n <p>\r\n <strong>Step 4: </strong> If the issue is resolved,{' '}\r\n <button onClick={resumePlan} disabled={shouldBeInaccessible}>\r\n <Icon type=\"play\" size={12} /> Resume\r\n </button>{' '}\r\n the backup plan.\r\n </p>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <SidePanel\r\n title=\"Check Backup Integrity\"\r\n icon={'integrity'}\r\n // errorMessage={integrityCheckMutation.error?.message}\r\n close={() => onClose()}\r\n width=\"800px\"\r\n >\r\n <div className={classes.repairContainer}>\r\n {shouldBeInaccessible && (\r\n <div className={classes.overlay}>\r\n <Icon type=\"loading\" size={36} />\r\n </div>\r\n )}\r\n {errorType === 'pack_file_error' && renderMissingPackRepairContent()}\r\n {errorType === 'repairable_pack_file_error' && renderPackRepairContent()}\r\n {errorType === 'index_error' && renderIndexRepairContent()}\r\n <small>\r\n If performing the above actions does not resolve the issue, please follow this{' '}\r\n <a href=\"https://restic.readthedocs.io/en/stable/077_troubleshooting.html\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n Restic Troubleshooting Guide\r\n </a>\r\n .\r\n </small>\r\n </div>\r\n </SidePanel>\r\n );\r\n};\r\n\r\nexport default PlanRepair;\r\n"],"names":["PlanRepair","planId","errorType","onClose","onOpenIntegrity","pauseMutation","usePausePlan","resumeMutation","useResumePlan","performBackupMutation","usePerformBackup","repairRepoMutation","useRepairBackupPlan","shouldBeInaccessible","pausePlan","toast","data","resumePlan","runBackup","repairRepo","type","renderMissingPackRepairContent","jsxs","classes","jsx","Icon","renderPackRepairContent","renderIndexRepairContent","SidePanel"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const r = "_repairContainer_HzFvh", e = "_repairContent_MQqQH", t = "_repairTitle_9omst", a = "_overlay_KQEaI", n = {
|
|
2
|
+
repairContainer: r,
|
|
3
|
+
repairContent: e,
|
|
4
|
+
repairTitle: t,
|
|
5
|
+
overlay: a
|
|
6
|
+
};
|
|
7
|
+
export {
|
|
8
|
+
n as default,
|
|
9
|
+
a as overlay,
|
|
10
|
+
r as repairContainer,
|
|
11
|
+
e as repairContent,
|
|
12
|
+
t as repairTitle
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=PlanRepair.module.scss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanRepair.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { NewPlanSettings } from '../../../@types/plans';
|
|
1
|
+
import { NewPlanSettings, PlanAddRunSettings } from '../../../@types/plans';
|
|
2
2
|
import { Device } from '../../../@types/devices';
|
|
3
3
|
interface PlanAdvancedSettingsProps {
|
|
4
4
|
plan: NewPlanSettings;
|
|
@@ -6,7 +6,9 @@ interface PlanAdvancedSettingsProps {
|
|
|
6
6
|
device: Device;
|
|
7
7
|
onUpdate: (notificationSettings: NewPlanSettings) => void;
|
|
8
8
|
isEditing: boolean;
|
|
9
|
+
runSettings?: PlanAddRunSettings;
|
|
10
|
+
setRunSettings?: (runSettings: PlanAddRunSettings) => void;
|
|
9
11
|
}
|
|
10
|
-
declare const PlanAdvancedSettings: ({ plan, appSettings, device, onUpdate, isEditing }: PlanAdvancedSettingsProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
declare const PlanAdvancedSettings: ({ plan, appSettings, device, onUpdate, isEditing, runSettings, setRunSettings }: PlanAdvancedSettingsProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
13
|
export default PlanAdvancedSettings;
|
|
12
14
|
//# sourceMappingURL=PlanAdvancedSettings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanAdvancedSettings.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSettings/PlanAdvancedSettings.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"PlanAdvancedSettings.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanSettings/PlanAdvancedSettings.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAM5E,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,UAAU,yBAAyB;IAChC,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,oBAAoB,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC7D;AAED,QAAA,MAAM,oBAAoB,GAAI,iFAAiF,yBAAyB,4CAiGvI,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|