@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.
Files changed (126) hide show
  1. package/dist-lib/@types/plans.d.ts +4 -0
  2. package/dist-lib/@types/plans.d.ts.map +1 -1
  3. package/dist-lib/components/Plan/AddPlan/AddPlan.d.ts.map +1 -1
  4. package/dist-lib/components/Plan/AddPlan/AddPlan.js +29 -24
  5. package/dist-lib/components/Plan/AddPlan/AddPlan.js.map +1 -1
  6. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +34 -33
  7. package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
  8. package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts +9 -0
  9. package/dist-lib/components/Plan/FilterPlans/FilterPlans.d.ts.map +1 -0
  10. package/dist-lib/components/Plan/FilterPlans/FilterPlans.js +117 -0
  11. package/dist-lib/components/Plan/FilterPlans/FilterPlans.js.map +1 -0
  12. package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js +20 -0
  13. package/dist-lib/components/Plan/FilterPlans/FilterPlans.module.scss.js.map +1 -0
  14. package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts +4 -2
  15. package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts.map +1 -1
  16. package/dist-lib/components/Plan/PlanForm/PlanForm.js +33 -29
  17. package/dist-lib/components/Plan/PlanForm/PlanForm.js.map +1 -1
  18. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts +2 -1
  19. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.d.ts.map +1 -1
  20. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js +85 -57
  21. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.js.map +1 -1
  22. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js +11 -9
  23. package/dist-lib/components/Plan/PlanIntegrity/PlanIntegrity.module.scss.js.map +1 -1
  24. package/dist-lib/components/Plan/PlanItems/PlanItem.js +1 -1
  25. package/dist-lib/components/Plan/PlanItems/PlanItem.js.map +1 -1
  26. package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts +9 -0
  27. package/dist-lib/components/Plan/PlanRepair/PlanRepair.d.ts.map +1 -0
  28. package/dist-lib/components/Plan/PlanRepair/PlanRepair.js +262 -0
  29. package/dist-lib/components/Plan/PlanRepair/PlanRepair.js.map +1 -0
  30. package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js +14 -0
  31. package/dist-lib/components/Plan/PlanRepair/PlanRepair.module.scss.js.map +1 -0
  32. package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts +4 -2
  33. package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.d.ts.map +1 -1
  34. package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js +24 -22
  35. package/dist-lib/components/Plan/PlanSettings/PlanAdvancedSettings.js.map +1 -1
  36. package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts +4 -2
  37. package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.d.ts.map +1 -1
  38. package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js +39 -28
  39. package/dist-lib/components/Plan/PlanSettings/PlanGeneralSettings.js.map +1 -1
  40. package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js +66 -64
  41. package/dist-lib/components/Plan/PlanSettings/PlanSettings.module.scss.js.map +1 -1
  42. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts +7 -0
  43. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.d.ts.map +1 -0
  44. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js +116 -0
  45. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.js.map +1 -0
  46. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js +20 -0
  47. package/dist-lib/components/Plan/PlanSizeChart/PlanSizeChart.module.scss.js.map +1 -0
  48. package/dist-lib/components/Plan/PlanStats/PlanStats.d.ts.map +1 -1
  49. package/dist-lib/components/Plan/PlanStats/PlanStats.js +29 -30
  50. package/dist-lib/components/Plan/PlanStats/PlanStats.js.map +1 -1
  51. package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js +16 -14
  52. package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js.map +1 -1
  53. package/dist-lib/components/common/Icon/Icon.d.ts.map +1 -1
  54. package/dist-lib/components/common/Icon/Icon.js +395 -378
  55. package/dist-lib/components/common/Icon/Icon.js.map +1 -1
  56. package/dist-lib/components/common/SortItems/SortItems.d.ts +2 -1
  57. package/dist-lib/components/common/SortItems/SortItems.d.ts.map +1 -1
  58. package/dist-lib/components/common/SortItems/SortItems.js +14 -14
  59. package/dist-lib/components/common/SortItems/SortItems.js.map +1 -1
  60. package/dist-lib/components/common/SortItems/SortItems.module.scss.js +1 -1
  61. package/dist-lib/components/common/form/MultiSelect/MultiSelect.module.scss.js +16 -16
  62. package/dist-lib/components/index.d.ts +2 -0
  63. package/dist-lib/components/index.d.ts.map +1 -1
  64. package/dist-lib/components.js +199 -195
  65. package/dist-lib/components.js.map +1 -1
  66. package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
  67. package/dist-lib/hooks/usePlanSingleActions.js +22 -19
  68. package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
  69. package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js +449 -0
  70. package/dist-lib/node_modules/.pnpm/@kurkle_color@0.3.4/node_modules/@kurkle/color/dist/color.esm.js.map +1 -0
  71. package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js +5219 -0
  72. package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chart.js.map +1 -0
  73. package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js +1691 -0
  74. package/dist-lib/node_modules/.pnpm/chart.js@4.5.1/node_modules/chart.js/dist/chunks/helpers.dataset.js.map +1 -0
  75. 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
  76. 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
  77. package/dist-lib/routes/Login/Login.d.ts.map +1 -1
  78. package/dist-lib/routes/Login/Login.js +45 -36
  79. package/dist-lib/routes/Login/Login.js.map +1 -1
  80. package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
  81. package/dist-lib/routes/PlanSingle/PlanSingle.js +131 -118
  82. package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
  83. package/dist-lib/routes/Plans/Plans.d.ts.map +1 -1
  84. package/dist-lib/routes/Plans/Plans.js +77 -51
  85. package/dist-lib/routes/Plans/Plans.js.map +1 -1
  86. package/dist-lib/services/plans.d.ts +33 -5
  87. package/dist-lib/services/plans.d.ts.map +1 -1
  88. package/dist-lib/services/plans.js +92 -67
  89. package/dist-lib/services/plans.js.map +1 -1
  90. package/dist-lib/services.js +93 -91
  91. package/dist-lib/styles/core-frontend.css +1 -1
  92. package/dist-lib/utils/helpers.d.ts +2 -0
  93. package/dist-lib/utils/helpers.d.ts.map +1 -1
  94. package/dist-lib/utils/helpers.js +68 -42
  95. package/dist-lib/utils/helpers.js.map +1 -1
  96. package/dist-lib/utils.js +36 -34
  97. package/package.json +3 -1
  98. package/src/@types/plans.ts +5 -0
  99. package/src/components/Plan/AddPlan/AddPlan.tsx +22 -16
  100. package/src/components/Plan/BackupProgress/BackupProgress.tsx +1 -1
  101. package/src/components/Plan/FilterPlans/FilterPlans.module.scss +65 -0
  102. package/src/components/Plan/FilterPlans/FilterPlans.tsx +126 -0
  103. package/src/components/Plan/PlanForm/PlanForm.tsx +7 -1
  104. package/src/components/Plan/PlanIntegrity/PlanIntegrity.module.scss +19 -0
  105. package/src/components/Plan/PlanIntegrity/PlanIntegrity.tsx +40 -3
  106. package/src/components/Plan/PlanItems/PlanItem.tsx +1 -1
  107. package/src/components/Plan/PlanRepair/PlanRepair.module.scss +53 -0
  108. package/src/components/Plan/PlanRepair/PlanRepair.tsx +243 -0
  109. package/src/components/Plan/PlanSettings/PlanAdvancedSettings.tsx +6 -2
  110. package/src/components/Plan/PlanSettings/PlanGeneralSettings.tsx +14 -2
  111. package/src/components/Plan/PlanSettings/PlanSettings.module.scss +8 -0
  112. package/src/components/Plan/PlanSizeChart/PlanSizeChart.module.scss +76 -0
  113. package/src/components/Plan/PlanSizeChart/PlanSizeChart.tsx +163 -0
  114. package/src/components/Plan/PlanStats/PlanStats.module.scss +16 -2
  115. package/src/components/Plan/PlanStats/PlanStats.tsx +8 -11
  116. package/src/components/common/Icon/Icon.tsx +21 -0
  117. package/src/components/common/SortItems/SortItems.module.scss +3 -2
  118. package/src/components/common/SortItems/SortItems.tsx +6 -3
  119. package/src/components/common/form/MultiSelect/MultiSelect.module.scss +1 -0
  120. package/src/components/index.ts +2 -0
  121. package/src/hooks/usePlanSingleActions.tsx +26 -23
  122. package/src/routes/Login/Login.tsx +8 -2
  123. package/src/routes/PlanSingle/PlanSingle.tsx +17 -0
  124. package/src/routes/Plans/Plans.tsx +70 -35
  125. package/src/services/plans.ts +40 -4
  126. 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;AAYxD,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;CAClB,CAAC;AAEF,QAAA,MAAM,QAAQ,GAAI,qHAWf,aAAa,4CAqPf,CAAC;AAEF,eAAe,QAAQ,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 y } from "react";
2
+ import { useState as E } from "react";
3
3
  import n from "../../common/Icon/Icon.js";
4
- import z from "../../common/SidePanel/SidePanel.js";
5
- import E from "../../common/form/StoragePicker/StoragePicker.js";
6
- import w from "../PlanSettings/PlanStrategySettings.js";
7
- import D from "../PlanSettings/PlanSourceSettings.js";
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 V } from "../../../services/settings.js";
11
- import q from "../PlanSettings/PlanAdvancedSettings.js";
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 L from "../../common/form/IntervalField/IntervalField.js";
14
- import T from "./PlanFormNav.js";
15
- import { useGetDevice as j } from "../../../services/devices.js";
16
- import A from "../PlanSettings/PlanPruneSettings.js";
17
- import G from "../PlanSettings/PlanReplicationSettings.js";
18
- const te = ({
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] = y(1), { data: u } = V(), U = ((N = u == null ? void 0 : u.result) == null ? void 0 : N.settings) || {}, { data: p } = j("main", !0), F = (b = p == null ? void 0 : p.result) == null ? void 0 : b.device, v = {
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
- }, R = (a) => {
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
- z,
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(T, { step: i, type: l, gotoStep: 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
- w,
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
- D,
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
- E,
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
- G,
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
- L,
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
- A,
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
- q,
204
+ T,
203
205
  {
204
206
  plan: e,
205
- appSettings: U,
207
+ appSettings: R,
206
208
  onUpdate: d,
207
- device: F,
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
- te as default
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;CACtB;AAED,QAAA,MAAM,aAAa,GAAI,kFAAuF,kBAAkB,4CAuK/H,CAAC;AAEF,eAAe,aAAa,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 r, jsxs as i } from "react/jsx-runtime";
2
- import { useState as b } from "react";
3
- import l from "./PlanIntegrity.module.scss.js";
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 B, formatDateTime as E } from "../../../utils/helpers.js";
6
- import m from "../../common/Icon/Icon.js";
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 O = ({ planId: C, taskPending: x, verificationData: t, storage: A, replicationStorages: g = [], onClose: p }) => {
9
- var k;
10
- const [a, P] = b("primary"), d = L(), u = t && (t == null ? void 0 : t.result), w = g && g.length > 0, h = (n) => t != null && t.result ? t.result[n] ?? null : null, f = (n) => {
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(n), s = e == null ? void 0 : e.logs;
13
- return s != null && s.length ? /* @__PURE__ */ i("div", { className: l.integrityLogs, children: [
14
- /* @__PURE__ */ i("div", { className: l.integrityLogsHeader, children: [
15
- /* @__PURE__ */ r("div", { children: "Integrity Check Output Logs" }),
16
- /* @__PURE__ */ i("div", { title: E(t.endedAt || t.startedAt), children: [
17
- /* @__PURE__ */ r(m, { type: "clock", size: 14 }),
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
- B(new Date(t.endedAt || t.startedAt))
19
+ z(new Date(l.endedAt || l.startedAt))
20
20
  ] })
21
21
  ] }),
22
- /* @__PURE__ */ r("div", { className: l.integrityLogMessages, children: s.map((o, c) => /* @__PURE__ */ r("span", { children: o }, c)) })
22
+ /* @__PURE__ */ n("div", { className: s.integrityLogMessages, children: t.map((o, c) => /* @__PURE__ */ n("span", { children: o }, c)) })
23
23
  ] }) : null;
24
- }, y = (n) => {
25
- if (!u || d.isPending) return null;
26
- const e = h(n);
27
- return e != null && e.hasError ? /* @__PURE__ */ i("div", { className: l.fixSuggestion, children: [
28
- /* @__PURE__ */ r("h4", { children: "Fix Suggestion" }),
29
- /* @__PURE__ */ i("div", { className: l.fixSuggestionContent, children: [
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((s, o) => /* @__PURE__ */ r("p", { children: s.includes("`") ? /* @__PURE__ */ r("code", { children: s.replace(/`/g, "") }) : s }, o)),
32
- !e.fix && /* @__PURE__ */ r("p", { children: "No Suggestion for this issue." }),
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__ */ r(
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 = (n) => {
49
- if (!u || d.isPending) return null;
50
- const e = h(n), s = e == null ? void 0 : e.hasError, o = e == null ? void 0 : e.message;
51
- return !s && (o != null && o.includes("No Issue Detected")) ? /* @__PURE__ */ r("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
+ }, 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
- }, I = () => /* @__PURE__ */ r("div", { className: `${l.integrityResult} ${l.withReplications}`, children: t && Object.entries(t.result).map(([n]) => {
56
- let e = A;
57
- if (n !== "primary") {
58
- const c = g.find((S) => S.storageId === n.replace("mirror_", ""));
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 s = h(n), o = s == null ? void 0 : s.hasError;
63
- return /* @__PURE__ */ i("div", { className: l.replicationResult, children: [
64
- /* @__PURE__ */ i("h4", { onClick: () => P(n), className: a === n ? l.active : "", children: [
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__ */ r("img", { src: `/providers/${e.type}.png` }),
94
+ /* @__PURE__ */ n("img", { src: `/providers/${e.type}.png` }),
67
95
  e.name,
68
96
  " ",
69
- /* @__PURE__ */ r("i", { children: n === "primary" ? "Primary" : "Mirror" })
97
+ /* @__PURE__ */ n("i", { children: r === "primary" ? "Primary" : "Mirror" })
70
98
  ] }),
71
- /* @__PURE__ */ r("span", { children: o ? /* @__PURE__ */ r(m, { type: "error-circle-filled", size: 14, color: "#ff4d4f" }) : /* @__PURE__ */ r(m, { type: "check-circle-filled", size: 14, color: "#06ba9f" }) })
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
- a === n && /* @__PURE__ */ i("div", { className: l.replicationResultContent, children: [
74
- N(n),
75
- f(n),
76
- y(n)
101
+ f === r && /* @__PURE__ */ i("div", { className: s.replicationResultContent, children: [
102
+ N(r),
103
+ y(r),
104
+ _(r)
77
105
  ] })
78
- ] }, n);
106
+ ] }, r);
79
107
  }) });
80
- return /* @__PURE__ */ r(
108
+ return /* @__PURE__ */ n(
81
109
  M,
82
110
  {
83
111
  title: "Check Backup Integrity",
84
- message: /* @__PURE__ */ i("div", { className: l.integrityMessage, children: [
85
- !u && /* @__PURE__ */ r("p", { children: "Check the integrity of the backup snapshots now to check if they are restorable?" }),
86
- u && /* @__PURE__ */ r("div", { children: w ? I() : /* @__PURE__ */ i("div", { className: l.integrityResult, children: [
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
- f("primary"),
89
- y("primary")
116
+ y("primary"),
117
+ _("primary")
90
118
  ] }) }),
91
119
  d.isPending && /* @__PURE__ */ i("div", { className: "label in_progress", children: [
92
- /* @__PURE__ */ r(m, { type: "loading", size: 14 }),
120
+ /* @__PURE__ */ n(u, { type: "loading", size: 14 }),
93
121
  "Checking integrity..."
94
122
  ] })
95
123
  ] }),
96
- errorMessage: (k = d.error) == null ? void 0 : k.message,
97
- closeModal: () => p(),
124
+ errorMessage: (x = d.error) == null ? void 0 : x.message,
125
+ closeModal: () => g(),
98
126
  width: "600px",
99
127
  primaryAction: {
100
- title: u ? "Check Again" : "Check Now",
128
+ title: p ? "Check Again" : "Check Now",
101
129
  type: "default",
102
130
  isPending: d.isPending,
103
- action: () => !x && d.mutate({ planId: C })
131
+ action: () => !k && d.mutate({ planId: C })
104
132
  },
105
133
  secondaryAction: {
106
134
  title: "Close",
107
- action: () => p()
135
+ action: () => g()
108
136
  }
109
137
  }
110
138
  );
111
139
  };
112
140
  export {
113
- O as default
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 = "_integrityMessage_caT6I", e = "_fixSuggestion_Px9zO", i = "_fixSuggestionContent_CuKfL", s = "_integrityLogs_HZjHu", n = "_integrityLogsHeader_vyTxM", g = "_integrityLogMessages_MfLTN", o = "_integrityResult_yCU6S", r = "_withReplications_fHXSy", c = "_replicationResult_ROcyJ", a = "_replicationResultContent_W1PZ5", l = {
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: g,
8
- integrityResult: o,
7
+ integrityLogMessages: o,
8
+ integrityResult: g,
9
9
  withReplications: r,
10
- replicationResult: c,
11
- replicationResultContent: a
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
- g as integrityLogMessages,
18
+ o as integrityLogMessages,
18
19
  s as integrityLogs,
19
20
  n as integrityLogsHeader,
20
21
  t as integrityMessage,
21
- o as integrityResult,
22
- c as replicationResult,
23
- a as replicationResultContent,
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":";;;;;;;;;;;;;"}