@plutonhq/core-frontend 0.1.32 → 0.1.33
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/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/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/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/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/PlanSettings.module.scss +8 -0
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.module.scss +76 -0
- package/src/components/Plan/PlanSizeChart/PlanSizeChart.tsx +163 -0
- package/src/components/Plan/PlanStats/PlanStats.module.scss +16 -2
- package/src/components/Plan/PlanStats/PlanStats.tsx +8 -11
- 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":"PlanForm.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanForm/PlanForm.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"PlanForm.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanForm/PlanForm.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAY5E,KAAK,aAAa,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,eAAe,CAAC;IAC9B,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,oBAAoB,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC7D,CAAC;AAEF,QAAA,MAAM,QAAQ,GAAI,kJAaf,aAAa,4CAuPf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { jsxs as o, jsx as r } from "react/jsx-runtime";
|
|
2
|
-
import { useState as
|
|
2
|
+
import { useState as E } from "react";
|
|
3
3
|
import n from "../../common/Icon/Icon.js";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
4
|
+
import w from "../../common/SidePanel/SidePanel.js";
|
|
5
|
+
import D from "../../common/form/StoragePicker/StoragePicker.js";
|
|
6
|
+
import V from "../PlanSettings/PlanStrategySettings.js";
|
|
7
|
+
import q from "../PlanSettings/PlanSourceSettings.js";
|
|
8
8
|
import t from "../AddPlan/AddPlan.module.scss.js";
|
|
9
9
|
import c from "./PlanForm.module.scss.js";
|
|
10
|
-
import { useGetSettings as
|
|
11
|
-
import
|
|
10
|
+
import { useGetSettings as L } from "../../../services/settings.js";
|
|
11
|
+
import T from "../PlanSettings/PlanAdvancedSettings.js";
|
|
12
12
|
import { isPlanSettingsValid as s } from "../../../utils/plans.js";
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import { useGetDevice as
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
const
|
|
13
|
+
import j from "../../common/form/IntervalField/IntervalField.js";
|
|
14
|
+
import A from "./PlanFormNav.js";
|
|
15
|
+
import { useGetDevice as G } from "../../../services/devices.js";
|
|
16
|
+
import _ from "../PlanSettings/PlanPruneSettings.js";
|
|
17
|
+
import W from "../PlanSettings/PlanReplicationSettings.js";
|
|
18
|
+
const le = ({
|
|
19
19
|
title: P,
|
|
20
20
|
planSettings: e,
|
|
21
21
|
type: l,
|
|
@@ -25,10 +25,12 @@ const te = ({
|
|
|
25
25
|
close: I,
|
|
26
26
|
storagePath: x,
|
|
27
27
|
storageId: B,
|
|
28
|
-
planId: C
|
|
28
|
+
planId: C,
|
|
29
|
+
runSettings: U,
|
|
30
|
+
setRunSettings: F
|
|
29
31
|
}) => {
|
|
30
32
|
var N, b, k;
|
|
31
|
-
const [i, m] =
|
|
33
|
+
const [i, m] = E(1), { data: u } = L(), R = ((N = u == null ? void 0 : u.result) == null ? void 0 : N.settings) || {}, { data: p } = G("main", !0), y = (b = p == null ? void 0 : p.result) == null ? void 0 : b.device, v = {
|
|
32
34
|
1: {
|
|
33
35
|
title: "Next: Configure Source & Destination",
|
|
34
36
|
onClick: () => s(e, i) && m(i + 1)
|
|
@@ -42,13 +44,13 @@ const te = ({
|
|
|
42
44
|
title: "Create Plan",
|
|
43
45
|
onClick: () => s(e, !1) && f()
|
|
44
46
|
}
|
|
45
|
-
},
|
|
47
|
+
}, z = (a) => {
|
|
46
48
|
if (l !== "edit")
|
|
47
49
|
return;
|
|
48
50
|
s(e, i) && m(a);
|
|
49
51
|
};
|
|
50
52
|
return /* @__PURE__ */ o(
|
|
51
|
-
|
|
53
|
+
w,
|
|
52
54
|
{
|
|
53
55
|
title: P,
|
|
54
56
|
icon: /* @__PURE__ */ r(n, { type: "backup", size: 20 }),
|
|
@@ -72,7 +74,7 @@ const te = ({
|
|
|
72
74
|
] }) })
|
|
73
75
|
] }) }),
|
|
74
76
|
children: [
|
|
75
|
-
/* @__PURE__ */ r(
|
|
77
|
+
/* @__PURE__ */ r(A, { step: i, type: l, gotoStep: z }),
|
|
76
78
|
/* @__PURE__ */ o("div", { className: `${c.formContent} styled__scrollbar`, children: [
|
|
77
79
|
h && /* @__PURE__ */ r("div", { className: t.loader, children: /* @__PURE__ */ r(n, { size: 36, type: "loading" }) }),
|
|
78
80
|
i === 1 && /* @__PURE__ */ o("div", { className: c.planStep, children: [
|
|
@@ -104,7 +106,7 @@ const te = ({
|
|
|
104
106
|
)
|
|
105
107
|
] }),
|
|
106
108
|
e.sourceType === "device" && /* @__PURE__ */ r(
|
|
107
|
-
|
|
109
|
+
V,
|
|
108
110
|
{
|
|
109
111
|
plan: e,
|
|
110
112
|
onUpdate: (a) => d({ ...e, method: a }),
|
|
@@ -136,7 +138,7 @@ const te = ({
|
|
|
136
138
|
] }),
|
|
137
139
|
i === 2 && /* @__PURE__ */ o("div", { className: c.planStep, children: [
|
|
138
140
|
/* @__PURE__ */ r(
|
|
139
|
-
|
|
141
|
+
q,
|
|
140
142
|
{
|
|
141
143
|
plan: e,
|
|
142
144
|
onUpdate: (a) => d({ ...a }),
|
|
@@ -148,7 +150,7 @@ const te = ({
|
|
|
148
150
|
/* @__PURE__ */ r("label", { className: t.label, children: "Backup Destination*" }),
|
|
149
151
|
!e.storage.name && /* @__PURE__ */ r("span", { className: t.fieldErrorLabel, children: "Required" }),
|
|
150
152
|
/* @__PURE__ */ r(
|
|
151
|
-
|
|
153
|
+
D,
|
|
152
154
|
{
|
|
153
155
|
storagePath: x || e.storagePath,
|
|
154
156
|
storageId: B || ((k = e.storage) == null ? void 0 : k.id) || "",
|
|
@@ -163,7 +165,7 @@ const te = ({
|
|
|
163
165
|
)
|
|
164
166
|
] }),
|
|
165
167
|
/* @__PURE__ */ r(
|
|
166
|
-
|
|
168
|
+
W,
|
|
167
169
|
{
|
|
168
170
|
replication: e.settings.replication,
|
|
169
171
|
primaryStorageId: e.storage.id,
|
|
@@ -180,7 +182,7 @@ const te = ({
|
|
|
180
182
|
] }),
|
|
181
183
|
i === 3 && /* @__PURE__ */ o("div", { className: c.planStep, children: [
|
|
182
184
|
/* @__PURE__ */ r("div", { className: t.field, style: { width: "150px" }, children: /* @__PURE__ */ r(
|
|
183
|
-
|
|
185
|
+
j,
|
|
184
186
|
{
|
|
185
187
|
label: "Backup Interval",
|
|
186
188
|
fieldValue: e.settings.interval,
|
|
@@ -188,7 +190,7 @@ const te = ({
|
|
|
188
190
|
}
|
|
189
191
|
) }),
|
|
190
192
|
/* @__PURE__ */ r(
|
|
191
|
-
|
|
193
|
+
_,
|
|
192
194
|
{
|
|
193
195
|
plan: e,
|
|
194
196
|
onUpdate: (a) => d({
|
|
@@ -199,13 +201,15 @@ const te = ({
|
|
|
199
201
|
)
|
|
200
202
|
] }),
|
|
201
203
|
i === 4 && /* @__PURE__ */ r("div", { className: c.planStep, children: /* @__PURE__ */ r(
|
|
202
|
-
|
|
204
|
+
T,
|
|
203
205
|
{
|
|
204
206
|
plan: e,
|
|
205
|
-
appSettings:
|
|
207
|
+
appSettings: R,
|
|
206
208
|
onUpdate: d,
|
|
207
|
-
device:
|
|
208
|
-
isEditing: l === "edit"
|
|
209
|
+
device: y,
|
|
210
|
+
isEditing: l === "edit",
|
|
211
|
+
runSettings: U,
|
|
212
|
+
setRunSettings: F
|
|
209
213
|
}
|
|
210
214
|
) })
|
|
211
215
|
] })
|
|
@@ -214,6 +218,6 @@ const te = ({
|
|
|
214
218
|
);
|
|
215
219
|
};
|
|
216
220
|
export {
|
|
217
|
-
|
|
221
|
+
le as default
|
|
218
222
|
};
|
|
219
223
|
//# sourceMappingURL=PlanForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanForm.js","sources":["../../../../src/components/Plan/PlanForm/PlanForm.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport SidePanel from '../../common/SidePanel/SidePanel';\r\nimport StoragePicker from '../../common/form/StoragePicker/StoragePicker';\r\nimport PlanStrategySettings from '../PlanSettings/PlanStrategySettings';\r\nimport PlanSourceSettings from '../PlanSettings/PlanSourceSettings';\r\nimport { NewPlanSettings } from '../../../@types/plans';\r\nimport classes from '../AddPlan/AddPlan.module.scss';\r\nimport PFClasses from './PlanForm.module.scss';\r\nimport { useGetSettings } from '../../../services/settings';\r\nimport PlanAdvancedSettings from '../PlanSettings/PlanAdvancedSettings';\r\nimport { isPlanSettingsValid } from '../../../utils/plans';\r\nimport IntervalField from '../../common/form/IntervalField/IntervalField';\r\nimport PlanFormNav from './PlanFormNav';\r\nimport { useGetDevice } from '../../../services/devices';\r\nimport PlanPruneSettings from '../PlanSettings/PlanPruneSettings';\r\nimport PlanReplicationSettings from '../PlanSettings/PlanReplicationSettings';\r\n\r\ntype PlanFormProps = {\r\n title: string;\r\n planSettings: NewPlanSettings;\r\n type: 'add' | 'edit';\r\n onPlanSettingsChange: (settings: NewPlanSettings) => void;\r\n onSubmit: () => void;\r\n isSubmitting: boolean;\r\n close: () => void;\r\n storagePath?: string;\r\n storageId?: string;\r\n planId?: string;\r\n};\r\n\r\nconst PlanForm = ({\r\n title,\r\n planSettings,\r\n type,\r\n onPlanSettingsChange,\r\n onSubmit,\r\n isSubmitting,\r\n close,\r\n storagePath,\r\n storageId,\r\n planId,\r\n}: PlanFormProps) => {\r\n const [step, setStep] = useState<number>(1);\r\n\r\n const { data: settingsData } = useGetSettings();\r\n const appSettings = settingsData?.result?.settings || {};\r\n // const smtpConnected = appSettings?.integration?.smtp?.connected ? true : false;\r\n\r\n const { data: deviceData } = useGetDevice('main', true);\r\n const deviceInstance = deviceData?.result?.device;\r\n\r\n const buttonTexts: Record<number, { title: string; onClick: () => void }> = {\r\n 1: {\r\n title: 'Next: Configure Source & Destination',\r\n onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1),\r\n },\r\n 2: {\r\n title: 'Next: Setup Schedule & Retention',\r\n onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1),\r\n },\r\n 3: { title: 'Next: Advanced Settings', onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1) },\r\n 4: {\r\n title: 'Create Plan',\r\n onClick: () => isPlanSettingsValid(planSettings, false) && onSubmit(),\r\n },\r\n };\r\n\r\n const gotoStep = (nStep: number) => {\r\n if (type !== 'edit') {\r\n return;\r\n }\r\n\r\n const isSettingsValid = isPlanSettingsValid(planSettings, step);\r\n if (isSettingsValid) {\r\n setStep(nStep);\r\n }\r\n };\r\n\r\n return (\r\n <SidePanel\r\n title={title}\r\n icon={<Icon type={'backup'} size={20} />}\r\n width={type === 'add' ? '100%' : undefined}\r\n headerWidth={type === 'add' ? '740px' : undefined}\r\n close={close}\r\n withTabs={true}\r\n footer={\r\n <div className={PFClasses.planFormFooter}>\r\n <div className={PFClasses.footerContainer}>\r\n <div className={classes.footerLeft}>\r\n <div className={classes.summary}>\r\n {type === 'add' && step > 1 && (\r\n <button className={PFClasses.backButton} onClick={() => step > 0 && setStep(step - 1)} disabled={isSubmitting}>\r\n <Icon type=\"arrow-left\" size={14} /> Back\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n <div className={classes.footerRight}>\r\n {type === 'add' ? (\r\n <button className={classes.createButton} onClick={buttonTexts[step].onClick}>\r\n <Icon type=\"check\" size={12} /> {buttonTexts[step].title}\r\n </button>\r\n ) : (\r\n <button className={classes.createButton} onClick={() => isPlanSettingsValid(planSettings, false) && onSubmit()}>\r\n <Icon type=\"check\" size={12} /> {'Update Plan'}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n >\r\n <PlanFormNav step={step} type={type} gotoStep={gotoStep} />\r\n\r\n <div className={`${PFClasses.formContent} styled__scrollbar`}>\r\n {isSubmitting && (\r\n <div className={classes.loader}>\r\n <Icon size={36} type=\"loading\" />\r\n </div>\r\n )}\r\n {step === 1 && (\r\n <div className={PFClasses.planStep}>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Plan Name*</label>\r\n {!planSettings.title && <span className={classes.fieldErrorLabel}>{'Required'}</span>}\r\n <input\r\n className={classes.titleInput}\r\n type=\"text\"\r\n placeholder=\"Plan Name\"\r\n value={planSettings.title || ''}\r\n onChange={(e) => onPlanSettingsChange({ ...planSettings, title: e.target.value })}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Plan Description</label>\r\n <input\r\n className={classes.titleInput}\r\n type=\"text\"\r\n placeholder=\"Plan Description\"\r\n value={planSettings.description || ''}\r\n onChange={(e) => onPlanSettingsChange({ ...planSettings, description: e.target.value })}\r\n />\r\n </div>\r\n {/* <PlanTypeSettings\r\n plan={planSettings}\r\n onUpdate={(plan: NewPlanSettings) => onPlanSettingsChange({ ...plan })}\r\n disabled={type === 'edit' ? true : false}\r\n options={[\r\n {\r\n value: 'device',\r\n icon: 'computer',\r\n label: 'Device',\r\n description: 'Backup content of a Computer/Server',\r\n },\r\n {\r\n value: 'database',\r\n icon: 'database',\r\n label: 'Database',\r\n description: 'Backup a Database',\r\n disabled: true,\r\n },\r\n {\r\n value: 'googleworkspace',\r\n icon: 'google-workspace',\r\n label: 'Google Workspace',\r\n description: 'Backup Google Workspace',\r\n disabled: true,\r\n },\r\n {\r\n value: 'microsoft365',\r\n icon: 'microsoft-365',\r\n label: 'Microsoft 365',\r\n description: 'Backup Microsoft 365',\r\n disabled: true,\r\n },\r\n ]}\r\n /> */}\r\n {planSettings.sourceType === 'device' && (\r\n <PlanStrategySettings\r\n plan={planSettings}\r\n onUpdate={(method) => onPlanSettingsChange({ ...planSettings, method })}\r\n disabled={type === 'edit' ? true : false}\r\n options={[\r\n {\r\n value: 'backup',\r\n icon: 'backup',\r\n label: 'Incremental Backup',\r\n description: 'Periodically create Incremental backup snapshots of source',\r\n },\r\n // {\r\n // value: 'sync',\r\n // icon: 'reload',\r\n // label: 'Real-time Sync',\r\n // description: 'Maintain identical source (with revisions)',\r\n // disabled: true,\r\n // },\r\n // {\r\n // value: 'rescue',\r\n // icon: 'rescue',\r\n // label: 'Linux Server Backup',\r\n // description: 'Full Linux system backups with bootable ISO image',\r\n // disabled: true,\r\n // },\r\n ]}\r\n />\r\n )}\r\n </div>\r\n )}\r\n {step === 2 && (\r\n <div className={PFClasses.planStep}>\r\n <PlanSourceSettings\r\n plan={planSettings}\r\n onUpdate={(plan) => onPlanSettingsChange({ ...plan })}\r\n isEditing={type === 'edit' ? true : false}\r\n error={planSettings.sourceConfig.includes.length === 0 ? 'Required' : ''}\r\n />\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Destination*</label>\r\n {!planSettings.storage.name && <span className={classes.fieldErrorLabel}>{'Required'}</span>}\r\n <StoragePicker\r\n storagePath={storagePath || planSettings.storagePath}\r\n storageId={storageId || planSettings.storage?.id || ''}\r\n deviceId={planSettings.sourceId || 'main'}\r\n disabled={type === 'edit' ? true : false}\r\n onUpdate={(s: { storage: { name: string; id: string; type: string }; path: string }) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n storagePath: s.path,\r\n storage: { id: s.storage.id, name: s.storage.name },\r\n })\r\n }\r\n />\r\n </div>\r\n <PlanReplicationSettings\r\n replication={planSettings.settings.replication}\r\n primaryStorageId={planSettings.storage.id}\r\n primaryStoragePath={planSettings.storagePath}\r\n deviceId={planSettings.sourceId || 'main'}\r\n isEditing={type === 'edit' ? true : false}\r\n planID={planId}\r\n onUpdate={(replication) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n settings: { ...planSettings.settings, replication: replication },\r\n })\r\n }\r\n />\r\n </div>\r\n )}\r\n {step === 3 && (\r\n <div className={PFClasses.planStep}>\r\n <div className={classes.field} style={{ width: '150px' }}>\r\n <IntervalField\r\n label=\"Backup Interval\"\r\n fieldValue={planSettings.settings.interval}\r\n onUpdate={(intervalSettings) =>\r\n onPlanSettingsChange({ ...planSettings, settings: { ...planSettings.settings, interval: intervalSettings } })\r\n }\r\n />\r\n </div>\r\n <PlanPruneSettings\r\n plan={planSettings}\r\n onUpdate={(pruneSettings) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n settings: { ...planSettings.settings, prune: pruneSettings },\r\n })\r\n }\r\n />\r\n </div>\r\n )}\r\n {step === 4 && (\r\n <div className={PFClasses.planStep}>\r\n <PlanAdvancedSettings\r\n plan={planSettings}\r\n appSettings={appSettings}\r\n onUpdate={onPlanSettingsChange}\r\n device={deviceInstance}\r\n isEditing={type === 'edit'}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </SidePanel>\r\n );\r\n};\r\n\r\nexport default PlanForm;\r\n"],"names":["PlanForm","title","planSettings","type","onPlanSettingsChange","onSubmit","isSubmitting","close","storagePath","storageId","planId","step","setStep","useState","settingsData","useGetSettings","appSettings","_a","deviceData","useGetDevice","deviceInstance","_b","buttonTexts","isPlanSettingsValid","gotoStep","nStep","jsxs","SidePanel","jsx","Icon","PFClasses","classes","PlanFormNav","e","PlanStrategySettings","method","PlanSourceSettings","plan","StoragePicker","_c","s","PlanReplicationSettings","replication","IntervalField","intervalSettings","PlanPruneSettings","pruneSettings","PlanAdvancedSettings"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlanForm.js","sources":["../../../../src/components/Plan/PlanForm/PlanForm.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport SidePanel from '../../common/SidePanel/SidePanel';\r\nimport StoragePicker from '../../common/form/StoragePicker/StoragePicker';\r\nimport PlanStrategySettings from '../PlanSettings/PlanStrategySettings';\r\nimport PlanSourceSettings from '../PlanSettings/PlanSourceSettings';\r\nimport { NewPlanSettings, PlanAddRunSettings } from '../../../@types/plans';\r\nimport classes from '../AddPlan/AddPlan.module.scss';\r\nimport PFClasses from './PlanForm.module.scss';\r\nimport { useGetSettings } from '../../../services/settings';\r\nimport PlanAdvancedSettings from '../PlanSettings/PlanAdvancedSettings';\r\nimport { isPlanSettingsValid } from '../../../utils/plans';\r\nimport IntervalField from '../../common/form/IntervalField/IntervalField';\r\nimport PlanFormNav from './PlanFormNav';\r\nimport { useGetDevice } from '../../../services/devices';\r\nimport PlanPruneSettings from '../PlanSettings/PlanPruneSettings';\r\nimport PlanReplicationSettings from '../PlanSettings/PlanReplicationSettings';\r\n\r\ntype PlanFormProps = {\r\n title: string;\r\n planSettings: NewPlanSettings;\r\n type: 'add' | 'edit';\r\n onPlanSettingsChange: (settings: NewPlanSettings) => void;\r\n onSubmit: () => void;\r\n isSubmitting: boolean;\r\n close: () => void;\r\n storagePath?: string;\r\n storageId?: string;\r\n planId?: string;\r\n runSettings?: PlanAddRunSettings;\r\n setRunSettings?: (runSettings: PlanAddRunSettings) => void;\r\n};\r\n\r\nconst PlanForm = ({\r\n title,\r\n planSettings,\r\n type,\r\n onPlanSettingsChange,\r\n onSubmit,\r\n isSubmitting,\r\n close,\r\n storagePath,\r\n storageId,\r\n planId,\r\n runSettings,\r\n setRunSettings,\r\n}: PlanFormProps) => {\r\n const [step, setStep] = useState<number>(1);\r\n\r\n const { data: settingsData } = useGetSettings();\r\n const appSettings = settingsData?.result?.settings || {};\r\n // const smtpConnected = appSettings?.integration?.smtp?.connected ? true : false;\r\n\r\n const { data: deviceData } = useGetDevice('main', true);\r\n const deviceInstance = deviceData?.result?.device;\r\n\r\n const buttonTexts: Record<number, { title: string; onClick: () => void }> = {\r\n 1: {\r\n title: 'Next: Configure Source & Destination',\r\n onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1),\r\n },\r\n 2: {\r\n title: 'Next: Setup Schedule & Retention',\r\n onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1),\r\n },\r\n 3: { title: 'Next: Advanced Settings', onClick: () => isPlanSettingsValid(planSettings, step) && setStep(step + 1) },\r\n 4: {\r\n title: 'Create Plan',\r\n onClick: () => isPlanSettingsValid(planSettings, false) && onSubmit(),\r\n },\r\n };\r\n\r\n const gotoStep = (nStep: number) => {\r\n if (type !== 'edit') {\r\n return;\r\n }\r\n\r\n const isSettingsValid = isPlanSettingsValid(planSettings, step);\r\n if (isSettingsValid) {\r\n setStep(nStep);\r\n }\r\n };\r\n\r\n return (\r\n <SidePanel\r\n title={title}\r\n icon={<Icon type={'backup'} size={20} />}\r\n width={type === 'add' ? '100%' : undefined}\r\n headerWidth={type === 'add' ? '740px' : undefined}\r\n close={close}\r\n withTabs={true}\r\n footer={\r\n <div className={PFClasses.planFormFooter}>\r\n <div className={PFClasses.footerContainer}>\r\n <div className={classes.footerLeft}>\r\n <div className={classes.summary}>\r\n {type === 'add' && step > 1 && (\r\n <button className={PFClasses.backButton} onClick={() => step > 0 && setStep(step - 1)} disabled={isSubmitting}>\r\n <Icon type=\"arrow-left\" size={14} /> Back\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n <div className={classes.footerRight}>\r\n {type === 'add' ? (\r\n <button className={classes.createButton} onClick={buttonTexts[step].onClick}>\r\n <Icon type=\"check\" size={12} /> {buttonTexts[step].title}\r\n </button>\r\n ) : (\r\n <button className={classes.createButton} onClick={() => isPlanSettingsValid(planSettings, false) && onSubmit()}>\r\n <Icon type=\"check\" size={12} /> {'Update Plan'}\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n >\r\n <PlanFormNav step={step} type={type} gotoStep={gotoStep} />\r\n\r\n <div className={`${PFClasses.formContent} styled__scrollbar`}>\r\n {isSubmitting && (\r\n <div className={classes.loader}>\r\n <Icon size={36} type=\"loading\" />\r\n </div>\r\n )}\r\n {step === 1 && (\r\n <div className={PFClasses.planStep}>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Plan Name*</label>\r\n {!planSettings.title && <span className={classes.fieldErrorLabel}>{'Required'}</span>}\r\n <input\r\n className={classes.titleInput}\r\n type=\"text\"\r\n placeholder=\"Plan Name\"\r\n value={planSettings.title || ''}\r\n onChange={(e) => onPlanSettingsChange({ ...planSettings, title: e.target.value })}\r\n />\r\n </div>\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Plan Description</label>\r\n <input\r\n className={classes.titleInput}\r\n type=\"text\"\r\n placeholder=\"Plan Description\"\r\n value={planSettings.description || ''}\r\n onChange={(e) => onPlanSettingsChange({ ...planSettings, description: e.target.value })}\r\n />\r\n </div>\r\n {/* <PlanTypeSettings\r\n plan={planSettings}\r\n onUpdate={(plan: NewPlanSettings) => onPlanSettingsChange({ ...plan })}\r\n disabled={type === 'edit' ? true : false}\r\n options={[\r\n {\r\n value: 'device',\r\n icon: 'computer',\r\n label: 'Device',\r\n description: 'Backup content of a Computer/Server',\r\n },\r\n {\r\n value: 'database',\r\n icon: 'database',\r\n label: 'Database',\r\n description: 'Backup a Database',\r\n disabled: true,\r\n },\r\n {\r\n value: 'googleworkspace',\r\n icon: 'google-workspace',\r\n label: 'Google Workspace',\r\n description: 'Backup Google Workspace',\r\n disabled: true,\r\n },\r\n {\r\n value: 'microsoft365',\r\n icon: 'microsoft-365',\r\n label: 'Microsoft 365',\r\n description: 'Backup Microsoft 365',\r\n disabled: true,\r\n },\r\n ]}\r\n /> */}\r\n {planSettings.sourceType === 'device' && (\r\n <PlanStrategySettings\r\n plan={planSettings}\r\n onUpdate={(method) => onPlanSettingsChange({ ...planSettings, method })}\r\n disabled={type === 'edit' ? true : false}\r\n options={[\r\n {\r\n value: 'backup',\r\n icon: 'backup',\r\n label: 'Incremental Backup',\r\n description: 'Periodically create Incremental backup snapshots of source',\r\n },\r\n // {\r\n // value: 'sync',\r\n // icon: 'reload',\r\n // label: 'Real-time Sync',\r\n // description: 'Maintain identical source (with revisions)',\r\n // disabled: true,\r\n // },\r\n // {\r\n // value: 'rescue',\r\n // icon: 'rescue',\r\n // label: 'Linux Server Backup',\r\n // description: 'Full Linux system backups with bootable ISO image',\r\n // disabled: true,\r\n // },\r\n ]}\r\n />\r\n )}\r\n </div>\r\n )}\r\n {step === 2 && (\r\n <div className={PFClasses.planStep}>\r\n <PlanSourceSettings\r\n plan={planSettings}\r\n onUpdate={(plan) => onPlanSettingsChange({ ...plan })}\r\n isEditing={type === 'edit' ? true : false}\r\n error={planSettings.sourceConfig.includes.length === 0 ? 'Required' : ''}\r\n />\r\n <div className={classes.field}>\r\n <label className={classes.label}>Backup Destination*</label>\r\n {!planSettings.storage.name && <span className={classes.fieldErrorLabel}>{'Required'}</span>}\r\n <StoragePicker\r\n storagePath={storagePath || planSettings.storagePath}\r\n storageId={storageId || planSettings.storage?.id || ''}\r\n deviceId={planSettings.sourceId || 'main'}\r\n disabled={type === 'edit' ? true : false}\r\n onUpdate={(s: { storage: { name: string; id: string; type: string }; path: string }) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n storagePath: s.path,\r\n storage: { id: s.storage.id, name: s.storage.name },\r\n })\r\n }\r\n />\r\n </div>\r\n <PlanReplicationSettings\r\n replication={planSettings.settings.replication}\r\n primaryStorageId={planSettings.storage.id}\r\n primaryStoragePath={planSettings.storagePath}\r\n deviceId={planSettings.sourceId || 'main'}\r\n isEditing={type === 'edit' ? true : false}\r\n planID={planId}\r\n onUpdate={(replication) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n settings: { ...planSettings.settings, replication: replication },\r\n })\r\n }\r\n />\r\n </div>\r\n )}\r\n {step === 3 && (\r\n <div className={PFClasses.planStep}>\r\n <div className={classes.field} style={{ width: '150px' }}>\r\n <IntervalField\r\n label=\"Backup Interval\"\r\n fieldValue={planSettings.settings.interval}\r\n onUpdate={(intervalSettings) =>\r\n onPlanSettingsChange({ ...planSettings, settings: { ...planSettings.settings, interval: intervalSettings } })\r\n }\r\n />\r\n </div>\r\n <PlanPruneSettings\r\n plan={planSettings}\r\n onUpdate={(pruneSettings) =>\r\n onPlanSettingsChange({\r\n ...planSettings,\r\n settings: { ...planSettings.settings, prune: pruneSettings },\r\n })\r\n }\r\n />\r\n </div>\r\n )}\r\n {step === 4 && (\r\n <div className={PFClasses.planStep}>\r\n <PlanAdvancedSettings\r\n plan={planSettings}\r\n appSettings={appSettings}\r\n onUpdate={onPlanSettingsChange}\r\n device={deviceInstance}\r\n isEditing={type === 'edit'}\r\n runSettings={runSettings}\r\n setRunSettings={setRunSettings}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </SidePanel>\r\n );\r\n};\r\n\r\nexport default PlanForm;\r\n"],"names":["PlanForm","title","planSettings","type","onPlanSettingsChange","onSubmit","isSubmitting","close","storagePath","storageId","planId","runSettings","setRunSettings","step","setStep","useState","settingsData","useGetSettings","appSettings","_a","deviceData","useGetDevice","deviceInstance","_b","buttonTexts","isPlanSettingsValid","gotoStep","nStep","jsxs","SidePanel","jsx","Icon","PFClasses","classes","PlanFormNav","e","PlanStrategySettings","method","PlanSourceSettings","plan","StoragePicker","_c","s","PlanReplicationSettings","replication","IntervalField","intervalSettings","PlanPruneSettings","pruneSettings","PlanAdvancedSettings"],"mappings":"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"}
|
|
@@ -10,7 +10,8 @@ interface PlanIntegrityProps {
|
|
|
10
10
|
};
|
|
11
11
|
replicationStorages: PlanReplicationStorage[];
|
|
12
12
|
onClose: () => void;
|
|
13
|
+
onRepairOpen: (replicationId: string) => void;
|
|
13
14
|
}
|
|
14
|
-
declare const PlanIntegrity: ({ planId, taskPending, verificationData, storage, replicationStorages, onClose }: PlanIntegrityProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
declare const PlanIntegrity: ({ planId, taskPending, verificationData, storage, replicationStorages, onClose, onRepairOpen }: PlanIntegrityProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
16
|
export default PlanIntegrity;
|
|
16
17
|
//# sourceMappingURL=PlanIntegrity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanIntegrity.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanIntegrity/PlanIntegrity.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAsB,MAAM,iBAAiB,CAAC;AAKnF,UAAU,kBAAkB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"PlanIntegrity.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanIntegrity/PlanIntegrity.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAsB,MAAM,iBAAiB,CAAC;AAKnF,UAAU,kBAAkB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED,QAAA,MAAM,aAAa,GAAI,gGAAqG,kBAAkB,4CA2M7I,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,39 +1,43 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
import
|
|
1
|
+
import { jsx as n, jsxs as i } from "react/jsx-runtime";
|
|
2
|
+
import { useState as B } from "react";
|
|
3
|
+
import s from "./PlanIntegrity.module.scss.js";
|
|
4
4
|
import { useCheckPlanIntegrity as L } from "../../../services/plans.js";
|
|
5
|
-
import { timeAgo as
|
|
6
|
-
import
|
|
5
|
+
import { timeAgo as z, formatDateTime as E } from "../../../utils/helpers.js";
|
|
6
|
+
import u from "../../common/Icon/Icon.js";
|
|
7
7
|
import M from "../../common/ActionModal/ActionModal.js";
|
|
8
|
-
const
|
|
9
|
-
var
|
|
10
|
-
const [
|
|
8
|
+
const Y = ({ planId: C, taskPending: k, verificationData: l, storage: b, replicationStorages: m = [], onClose: g, onRepairOpen: a }) => {
|
|
9
|
+
var x;
|
|
10
|
+
const [f, S] = B("primary"), d = L(), p = l && (l == null ? void 0 : l.result), w = m && m.length > 0, h = (r) => l != null && l.result ? l.result[r] ?? null : null, y = (r) => {
|
|
11
11
|
if (d.isPending) return null;
|
|
12
|
-
const e = h(
|
|
13
|
-
return
|
|
14
|
-
/* @__PURE__ */ i("div", { className:
|
|
15
|
-
/* @__PURE__ */
|
|
16
|
-
/* @__PURE__ */ i("div", { title: E(
|
|
17
|
-
/* @__PURE__ */
|
|
12
|
+
const e = h(r), t = e == null ? void 0 : e.logs;
|
|
13
|
+
return t != null && t.length ? /* @__PURE__ */ i("div", { className: s.integrityLogs, children: [
|
|
14
|
+
/* @__PURE__ */ i("div", { className: s.integrityLogsHeader, children: [
|
|
15
|
+
/* @__PURE__ */ n("div", { children: "Integrity Check Output Logs" }),
|
|
16
|
+
/* @__PURE__ */ i("div", { title: E(l.endedAt || l.startedAt), children: [
|
|
17
|
+
/* @__PURE__ */ n(u, { type: "clock", size: 14 }),
|
|
18
18
|
" ",
|
|
19
|
-
|
|
19
|
+
z(new Date(l.endedAt || l.startedAt))
|
|
20
20
|
] })
|
|
21
21
|
] }),
|
|
22
|
-
/* @__PURE__ */
|
|
22
|
+
/* @__PURE__ */ n("div", { className: s.integrityLogMessages, children: t.map((o, c) => /* @__PURE__ */ n("span", { children: o }, c)) })
|
|
23
23
|
] }) : null;
|
|
24
|
-
},
|
|
25
|
-
if (!
|
|
26
|
-
const e = h(
|
|
27
|
-
return e != null && e.hasError ? /* @__PURE__ */ i("div", { className:
|
|
28
|
-
/* @__PURE__ */
|
|
29
|
-
/* @__PURE__ */ i("div", { className:
|
|
24
|
+
}, A = (r) => {
|
|
25
|
+
if (!p || d.isPending) return null;
|
|
26
|
+
const e = h(r);
|
|
27
|
+
return e != null && e.hasError ? /* @__PURE__ */ i("div", { className: s.fixSuggestion, children: [
|
|
28
|
+
/* @__PURE__ */ n("h4", { children: "Fix Suggestion" }),
|
|
29
|
+
/* @__PURE__ */ i("div", { className: s.fixSuggestionContent, children: [
|
|
30
30
|
e.fix && e.fix.split(`
|
|
31
|
-
`).map((
|
|
32
|
-
!e.fix && /* @__PURE__ */
|
|
31
|
+
`).map((t, o) => /* @__PURE__ */ n("p", { children: t.includes("`") ? /* @__PURE__ */ n("code", { children: t.replace(/`/g, "") }) : t }, o)),
|
|
32
|
+
!e.fix && /* @__PURE__ */ n("p", { children: "No Suggestion for this issue." }),
|
|
33
|
+
(e.errorType === "pack_file_error" || e.errorType === "index_error") && /* @__PURE__ */ i("p", { children: [
|
|
34
|
+
/* @__PURE__ */ n("button", { onClick: () => a(r), children: "Open Repo Repair" }),
|
|
35
|
+
" Window for more options."
|
|
36
|
+
] }),
|
|
33
37
|
/* @__PURE__ */ i("p", { children: [
|
|
34
38
|
"Learn more about fixing restic repo issues",
|
|
35
39
|
" ",
|
|
36
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ n(
|
|
37
41
|
"a",
|
|
38
42
|
{
|
|
39
43
|
href: "https://restic.readthedocs.io/en/latest/077_troubleshooting.html#find-out-what-is-damaged",
|
|
@@ -45,71 +49,95 @@ const O = ({ planId: C, taskPending: x, verificationData: t, storage: A, replica
|
|
|
45
49
|
] })
|
|
46
50
|
] })
|
|
47
51
|
] }) : null;
|
|
48
|
-
}, N = (
|
|
49
|
-
if (!
|
|
50
|
-
const e = h(
|
|
51
|
-
return !
|
|
52
|
+
}, N = (r) => {
|
|
53
|
+
if (!p || d.isPending) return null;
|
|
54
|
+
const e = h(r), t = e == null ? void 0 : e.hasError, o = e == null ? void 0 : e.message;
|
|
55
|
+
return !t && (o != null && o.includes("No Issue Detected")) ? /* @__PURE__ */ n("div", { className: "label success", children: "🥳 Yoohoo! No Corruption or Bit rot found. Your backup snapshots are completely restorable." }) : /* @__PURE__ */ i("div", { className: "label error", children: [
|
|
52
56
|
"⛔ Error Found. ",
|
|
53
57
|
o
|
|
54
58
|
] });
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
}, P = (r) => {
|
|
60
|
+
const e = h(r);
|
|
61
|
+
return /* @__PURE__ */ i("div", { className: s.repairBox, children: [
|
|
62
|
+
((e == null ? void 0 : e.errorType) === "pack_file_error" || (e == null ? void 0 : e.errorType) === "repairable_pack_file_error") && /* @__PURE__ */ i("div", { children: [
|
|
63
|
+
"Some pack files in the repository are either damaged or missing and can be repaired.",
|
|
64
|
+
" ",
|
|
65
|
+
/* @__PURE__ */ i("button", { onClick: () => a(r), children: [
|
|
66
|
+
/* @__PURE__ */ n(u, { type: "repair", size: 13 }),
|
|
67
|
+
" Open Repo Repair Tool"
|
|
68
|
+
] })
|
|
69
|
+
] }),
|
|
70
|
+
(e == null ? void 0 : e.errorType) === "index_error" && /* @__PURE__ */ i("div", { children: [
|
|
71
|
+
"The index files in the repository are corrupted and can be repaired.",
|
|
72
|
+
" ",
|
|
73
|
+
/* @__PURE__ */ i("button", { onClick: () => a(r), children: [
|
|
74
|
+
/* @__PURE__ */ n(u, { type: "repair", size: 13 }),
|
|
75
|
+
" Open Repo Repair Tool"
|
|
76
|
+
] }),
|
|
77
|
+
" "
|
|
78
|
+
] })
|
|
79
|
+
] });
|
|
80
|
+
}, _ = (r) => {
|
|
81
|
+
const e = h(r), t = e == null ? void 0 : e.errorType;
|
|
82
|
+
return t === "pack_file_error" || t === "index_error" || t === "repairable_pack_file_error" ? P(r) : A(r);
|
|
83
|
+
}, I = () => /* @__PURE__ */ n("div", { className: `${s.integrityResult} ${s.withReplications}`, children: l && Object.entries(l.result).map(([r]) => {
|
|
84
|
+
let e = b;
|
|
85
|
+
if (r !== "primary") {
|
|
86
|
+
const c = m.find((R) => R.storageId === r.replace("mirror_", ""));
|
|
59
87
|
c && (e = { name: c.storageName, type: c == null ? void 0 : c.storageType, id: c == null ? void 0 : c.storageId });
|
|
60
88
|
}
|
|
61
89
|
if (!e) return null;
|
|
62
|
-
const
|
|
63
|
-
return /* @__PURE__ */ i("div", { className:
|
|
64
|
-
/* @__PURE__ */ i("h4", { onClick: () =>
|
|
90
|
+
const t = h(r), o = t == null ? void 0 : t.hasError;
|
|
91
|
+
return /* @__PURE__ */ i("div", { className: s.replicationResult, children: [
|
|
92
|
+
/* @__PURE__ */ i("h4", { onClick: () => S(r), className: f === r ? s.active : "", children: [
|
|
65
93
|
/* @__PURE__ */ i("span", { children: [
|
|
66
|
-
/* @__PURE__ */
|
|
94
|
+
/* @__PURE__ */ n("img", { src: `/providers/${e.type}.png` }),
|
|
67
95
|
e.name,
|
|
68
96
|
" ",
|
|
69
|
-
/* @__PURE__ */
|
|
97
|
+
/* @__PURE__ */ n("i", { children: r === "primary" ? "Primary" : "Mirror" })
|
|
70
98
|
] }),
|
|
71
|
-
/* @__PURE__ */
|
|
99
|
+
/* @__PURE__ */ n("span", { children: o ? /* @__PURE__ */ n(u, { type: "error-circle-filled", size: 14, color: "#ff4d4f" }) : /* @__PURE__ */ n(u, { type: "check-circle-filled", size: 14, color: "#06ba9f" }) })
|
|
72
100
|
] }),
|
|
73
|
-
|
|
74
|
-
N(
|
|
75
|
-
|
|
76
|
-
|
|
101
|
+
f === r && /* @__PURE__ */ i("div", { className: s.replicationResultContent, children: [
|
|
102
|
+
N(r),
|
|
103
|
+
y(r),
|
|
104
|
+
_(r)
|
|
77
105
|
] })
|
|
78
|
-
] },
|
|
106
|
+
] }, r);
|
|
79
107
|
}) });
|
|
80
|
-
return /* @__PURE__ */
|
|
108
|
+
return /* @__PURE__ */ n(
|
|
81
109
|
M,
|
|
82
110
|
{
|
|
83
111
|
title: "Check Backup Integrity",
|
|
84
|
-
message: /* @__PURE__ */ i("div", { className:
|
|
85
|
-
!
|
|
86
|
-
|
|
112
|
+
message: /* @__PURE__ */ i("div", { className: s.integrityMessage, children: [
|
|
113
|
+
!p && /* @__PURE__ */ n("p", { children: "Check the integrity of the backup snapshots now to check if they are restorable?" }),
|
|
114
|
+
p && /* @__PURE__ */ n("div", { children: w ? I() : /* @__PURE__ */ i("div", { className: s.integrityResult, children: [
|
|
87
115
|
N("primary"),
|
|
88
|
-
|
|
89
|
-
|
|
116
|
+
y("primary"),
|
|
117
|
+
_("primary")
|
|
90
118
|
] }) }),
|
|
91
119
|
d.isPending && /* @__PURE__ */ i("div", { className: "label in_progress", children: [
|
|
92
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ n(u, { type: "loading", size: 14 }),
|
|
93
121
|
"Checking integrity..."
|
|
94
122
|
] })
|
|
95
123
|
] }),
|
|
96
|
-
errorMessage: (
|
|
97
|
-
closeModal: () =>
|
|
124
|
+
errorMessage: (x = d.error) == null ? void 0 : x.message,
|
|
125
|
+
closeModal: () => g(),
|
|
98
126
|
width: "600px",
|
|
99
127
|
primaryAction: {
|
|
100
|
-
title:
|
|
128
|
+
title: p ? "Check Again" : "Check Now",
|
|
101
129
|
type: "default",
|
|
102
130
|
isPending: d.isPending,
|
|
103
|
-
action: () => !
|
|
131
|
+
action: () => !k && d.mutate({ planId: C })
|
|
104
132
|
},
|
|
105
133
|
secondaryAction: {
|
|
106
134
|
title: "Close",
|
|
107
|
-
action: () =>
|
|
135
|
+
action: () => g()
|
|
108
136
|
}
|
|
109
137
|
}
|
|
110
138
|
);
|
|
111
139
|
};
|
|
112
140
|
export {
|
|
113
|
-
|
|
141
|
+
Y as default
|
|
114
142
|
};
|
|
115
143
|
//# sourceMappingURL=PlanIntegrity.js.map
|
|
@@ -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":";;;;;;;;;;;;;"}
|