@plutonhq/core-frontend 0.1.6 → 0.1.7
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/components/Plan/Backups/Backups.module.scss.js +44 -42
- package/dist-lib/components/Plan/Backups/Backups.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.d.ts +3 -2
- package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.js +29 -22
- package/dist-lib/components/Plan/PlanPendingBackup/PlanPendingBackup.js.map +1 -1
- package/dist-lib/components/Plan/PlanProgress/PlanProgress.d.ts +2 -1
- package/dist-lib/components/Plan/PlanProgress/PlanProgress.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanProgress/PlanProgress.js +22 -18
- package/dist-lib/components/Plan/PlanProgress/PlanProgress.js.map +1 -1
- package/dist-lib/components/Plan/Restores/Restores.js +5 -5
- package/dist-lib/components/Plan/Restores/Restores.js.map +1 -1
- package/dist-lib/components/Restore/RestoreFileSelector/RestoreFileSelector.js +73 -73
- package/dist-lib/components/Restore/RestoreFileSelector/RestoreFileSelector.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.d.ts.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js +50 -50
- package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js +8 -8
- package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js +34 -36
- package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js.map +1 -1
- package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.d.ts +2 -1
- package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.d.ts.map +1 -1
- package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.js +62 -60
- package/dist-lib/components/Restore/RestoredFileBrowser/RestoredFileBrowser.js.map +1 -1
- package/dist-lib/components/common/LogViewer/LogViewer.d.ts.map +1 -1
- package/dist-lib/components/common/LogViewer/LogViewer.js +51 -47
- package/dist-lib/components/common/LogViewer/LogViewer.js.map +1 -1
- package/dist-lib/components/common/LogViewer/LogViewer.module.scss.js +24 -24
- package/dist-lib/hooks/usePlanSingleActions.d.ts.map +1 -1
- package/dist-lib/hooks/usePlanSingleActions.js +49 -37
- package/dist-lib/hooks/usePlanSingleActions.js.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.d.ts.map +1 -1
- package/dist-lib/routes/PlanSingle/PlanSingle.js +68 -67
- package/dist-lib/routes/PlanSingle/PlanSingle.js.map +1 -1
- package/dist-lib/services/backups.d.ts.map +1 -1
- package/dist-lib/services/backups.js +35 -34
- package/dist-lib/services/backups.js.map +1 -1
- package/dist-lib/services/plans.d.ts +5 -2
- package/dist-lib/services/plans.d.ts.map +1 -1
- package/dist-lib/services/plans.js +45 -43
- package/dist-lib/services/plans.js.map +1 -1
- package/dist-lib/services/restores.d.ts.map +1 -1
- package/dist-lib/services/restores.js +56 -55
- package/dist-lib/services/restores.js.map +1 -1
- package/dist-lib/services.js +19 -19
- package/dist-lib/styles/core-frontend.css +1 -1
- package/package.json +1 -1
- package/src/components/Plan/Backups/Backups.module.scss +2 -1
- package/src/components/Plan/PlanPendingBackup/PlanPendingBackup.tsx +27 -18
- package/src/components/Plan/PlanProgress/PlanProgress.tsx +13 -2
- package/src/components/Plan/Restores/Restores.tsx +1 -1
- package/src/components/Restore/RestoreFileSelector/RestoreFileSelector.tsx +4 -4
- package/src/components/Restore/RestoreWizard/RestoreConfirmStep.tsx +26 -19
- package/src/components/Restore/RestoreWizard/RestorePreviewStep.tsx +1 -1
- package/src/components/Restore/RestoreWizard/RestoreWizard.module.scss +2 -2
- package/src/components/Restore/RestoredFileBrowser/RestoredFileBrowser.tsx +18 -14
- package/src/components/common/LogViewer/LogViewer.module.scss +1 -1
- package/src/components/common/LogViewer/LogViewer.tsx +18 -10
- package/src/hooks/usePlanSingleActions.tsx +21 -8
- package/src/routes/PlanSingle/PlanSingle.tsx +2 -0
- package/src/services/backups.ts +12 -4
- package/src/services/plans.ts +4 -3
- package/src/services/restores.ts +12 -4
|
@@ -1,52 +1,54 @@
|
|
|
1
|
-
const a = "
|
|
1
|
+
const a = "_backupsTable_xxleF", e = "_noBackups_kiIxb", t = "_backupsTableHead_BJWCZ", s = "_backupsTableContent_RhTcO", o = "_backupsTableRow_1V0gu", n = "_editIcon_pvZ1E", c = "_backupTitle_P0p7W", l = "_restoreTitle_3aIfN", _ = "_activeBackup_jTeNk", d = "_downloadLabel_9DzTd", b = "_downloadLabelFailed_xltYE", p = "_downloadLabelDone_Tsxqg", u = "_snapOptsBtn_xMayx", i = "_changes_1sOXU", k = "_changesNew_rghUF", T = "_changesModified_FGSxn", g = "_changesRemoved_XQVVD", r = "_target_LMkAJ", w = "_status_uUVvt", h = "_statusHasError_tvt0J", v = "_settings_wCSWo", B = "_backupsTableRowActive_WIaBM", x = "_updateModalContent_TtDFx", L = "_field_Eqs57", R = {
|
|
2
2
|
backupsTable: a,
|
|
3
3
|
noBackups: e,
|
|
4
|
-
backupsTableHead:
|
|
5
|
-
backupsTableContent:
|
|
6
|
-
backupsTableRow:
|
|
7
|
-
editIcon:
|
|
4
|
+
backupsTableHead: t,
|
|
5
|
+
backupsTableContent: s,
|
|
6
|
+
backupsTableRow: o,
|
|
7
|
+
editIcon: n,
|
|
8
8
|
backupTitle: c,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
9
|
+
restoreTitle: l,
|
|
10
|
+
activeBackup: _,
|
|
11
|
+
downloadLabel: d,
|
|
12
|
+
downloadLabelFailed: b,
|
|
13
|
+
downloadLabelDone: p,
|
|
14
|
+
snapOptsBtn: u,
|
|
15
|
+
changes: i,
|
|
16
|
+
changesNew: k,
|
|
17
|
+
changesModified: T,
|
|
18
|
+
changesRemoved: g,
|
|
19
|
+
target: r,
|
|
20
|
+
status: w,
|
|
21
|
+
statusHasError: h,
|
|
22
|
+
settings: v,
|
|
23
|
+
backupsTableRowActive: B,
|
|
24
|
+
updateModalContent: x,
|
|
25
|
+
field: L
|
|
25
26
|
};
|
|
26
27
|
export {
|
|
27
|
-
|
|
28
|
+
_ as activeBackup,
|
|
28
29
|
c as backupTitle,
|
|
29
30
|
a as backupsTable,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
31
|
+
s as backupsTableContent,
|
|
32
|
+
t as backupsTableHead,
|
|
33
|
+
o as backupsTableRow,
|
|
34
|
+
B as backupsTableRowActive,
|
|
35
|
+
i as changes,
|
|
36
|
+
T as changesModified,
|
|
37
|
+
k as changesNew,
|
|
38
|
+
g as changesRemoved,
|
|
39
|
+
R as default,
|
|
40
|
+
d as downloadLabel,
|
|
41
|
+
p as downloadLabelDone,
|
|
42
|
+
b as downloadLabelFailed,
|
|
43
|
+
n as editIcon,
|
|
44
|
+
L as field,
|
|
44
45
|
e as noBackups,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
l as restoreTitle,
|
|
47
|
+
v as settings,
|
|
48
|
+
u as snapOptsBtn,
|
|
49
|
+
w as status,
|
|
50
|
+
h as statusHasError,
|
|
51
|
+
r as target,
|
|
52
|
+
x as updateModalContent
|
|
51
53
|
};
|
|
52
54
|
//# sourceMappingURL=Backups.module.scss.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Backups.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Backups.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
interface PlanPendingBackup {
|
|
2
2
|
planId: string;
|
|
3
|
-
|
|
3
|
+
type?: 'backup' | 'restore';
|
|
4
|
+
onPendingDetect: () => void;
|
|
4
5
|
}
|
|
5
|
-
declare const PlanPendingBackup: ({ planId,
|
|
6
|
+
declare const PlanPendingBackup: ({ planId, type, onPendingDetect }: PlanPendingBackup) => import("react/jsx-runtime").JSX.Element;
|
|
6
7
|
export default PlanPendingBackup;
|
|
7
8
|
//# sourceMappingURL=PlanPendingBackup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanPendingBackup.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanPendingBackup/PlanPendingBackup.tsx"],"names":[],"mappings":"AAMA,UAAU,iBAAiB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,
|
|
1
|
+
{"version":3,"file":"PlanPendingBackup.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanPendingBackup/PlanPendingBackup.tsx"],"names":[],"mappings":"AAMA,UAAU,iBAAiB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,eAAe,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,QAAA,MAAM,iBAAiB,GAAI,mCAA8C,iBAAiB,4CAkDzF,CAAC;AACF,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,33 +1,40 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useEffect as
|
|
1
|
+
import { jsxs as r, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect as m } from "react";
|
|
3
3
|
import { useSearchParams as p } from "react-router";
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
const
|
|
8
|
-
const [,
|
|
9
|
-
return
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
4
|
+
import { useCheckActiveBackupsOrRestore as k } from "../../../services/plans.js";
|
|
5
|
+
import e from "./PlanPendingBackup.module.scss.js";
|
|
6
|
+
import o from "../../common/Icon/Icon.js";
|
|
7
|
+
const N = ({ planId: t, type: c = "backup", onPendingDetect: l }) => {
|
|
8
|
+
const [, d] = p(), u = k();
|
|
9
|
+
return m(() => {
|
|
10
|
+
const n = window.setInterval(() => {
|
|
11
|
+
u.mutate(
|
|
12
|
+
{ planId: t, type: c },
|
|
13
|
+
{
|
|
14
|
+
onSuccess: (i) => {
|
|
15
|
+
console.log("[isBackupPending] data :", i), i.result && (window.clearInterval(n), d((a) => (c === "restore" ? a.delete("pendingrestore") : a.delete("pendingbackup"), a)), l());
|
|
16
|
+
}
|
|
14
17
|
}
|
|
15
|
-
|
|
18
|
+
);
|
|
16
19
|
}, 1e3);
|
|
17
|
-
return () => window.clearInterval(
|
|
18
|
-
}, [
|
|
19
|
-
/* @__PURE__ */
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
-
/* @__PURE__ */
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
return () => window.clearInterval(n);
|
|
21
|
+
}, [t, c]), /* @__PURE__ */ r("div", { className: e.backup, children: [
|
|
22
|
+
/* @__PURE__ */ s("div", { className: e.backupIcon, children: /* @__PURE__ */ s(o, { type: "loading", size: 24 }) }),
|
|
23
|
+
/* @__PURE__ */ r("div", { className: e.backupLeft, children: [
|
|
24
|
+
/* @__PURE__ */ r("div", { className: e.backupId, children: [
|
|
25
|
+
"Starting ",
|
|
26
|
+
c,
|
|
27
|
+
"..."
|
|
28
|
+
] }),
|
|
29
|
+
/* @__PURE__ */ s("div", { className: e.backupStart, children: /* @__PURE__ */ r("div", { children: [
|
|
30
|
+
/* @__PURE__ */ s(o, { type: "clock", size: 12 }),
|
|
24
31
|
" Starting in a few seconds"
|
|
25
32
|
] }) })
|
|
26
33
|
] }),
|
|
27
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ s("div", { className: e.backupRight, children: /* @__PURE__ */ s("span", { className: `skeleton-box ${e.progressSkeleton}` }) })
|
|
28
35
|
] });
|
|
29
36
|
};
|
|
30
37
|
export {
|
|
31
|
-
|
|
38
|
+
N as default
|
|
32
39
|
};
|
|
33
40
|
//# sourceMappingURL=PlanPendingBackup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanPendingBackup.js","sources":["../../../../src/components/Plan/PlanPendingBackup/PlanPendingBackup.tsx"],"sourcesContent":["import { useEffect } from 'react';\r\nimport { useSearchParams } from 'react-router';\r\nimport {
|
|
1
|
+
{"version":3,"file":"PlanPendingBackup.js","sources":["../../../../src/components/Plan/PlanPendingBackup/PlanPendingBackup.tsx"],"sourcesContent":["import { useEffect } from 'react';\r\nimport { useSearchParams } from 'react-router';\r\nimport { useCheckActiveBackupsOrRestore } from '../../../services/plans';\r\nimport classes from './PlanPendingBackup.module.scss';\r\nimport Icon from '../../common/Icon/Icon';\r\n\r\ninterface PlanPendingBackup {\r\n planId: string;\r\n type?: 'backup' | 'restore';\r\n onPendingDetect: () => void;\r\n}\r\n\r\nconst PlanPendingBackup = ({ planId, type = 'backup', onPendingDetect }: PlanPendingBackup) => {\r\n const [, setSearchParams] = useSearchParams();\r\n const checkActivesMutation = useCheckActiveBackupsOrRestore();\r\n\r\n useEffect(() => {\r\n const interval = window.setInterval(() => {\r\n checkActivesMutation.mutate(\r\n { planId, type },\r\n {\r\n onSuccess: (data) => {\r\n console.log('[isBackupPending] data :', data);\r\n if (data.result) {\r\n window.clearInterval(interval);\r\n setSearchParams((params) => {\r\n if (type === 'restore') {\r\n params.delete('pendingrestore');\r\n } else {\r\n params.delete('pendingbackup');\r\n }\r\n\r\n return params;\r\n });\r\n onPendingDetect();\r\n }\r\n },\r\n },\r\n );\r\n }, 1000);\r\n\r\n return () => window.clearInterval(interval);\r\n }, [planId, type]);\r\n\r\n return (\r\n <div className={classes.backup}>\r\n <div className={classes.backupIcon}>\r\n <Icon type=\"loading\" size={24} />\r\n </div>\r\n <div className={classes.backupLeft}>\r\n <div className={classes.backupId}>Starting {type}...</div>\r\n <div className={classes.backupStart}>\r\n <div>\r\n <Icon type=\"clock\" size={12} /> Starting in a few seconds\r\n </div>\r\n </div>\r\n </div>\r\n <div className={classes.backupRight}>\r\n <span className={`skeleton-box ${classes.progressSkeleton}`} />\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default PlanPendingBackup;\r\n"],"names":["PlanPendingBackup","planId","type","onPendingDetect","setSearchParams","useSearchParams","checkActivesMutation","useCheckActiveBackupsOrRestore","useEffect","interval","data","params","jsxs","classes","jsx","Icon"],"mappings":";;;;;;AAYA,MAAMA,IAAoB,CAAC,EAAE,QAAAC,GAAQ,MAAAC,IAAO,UAAU,iBAAAC,QAAyC;AAC5F,QAAM,CAAA,EAAGC,CAAe,IAAIC,EAAA,GACtBC,IAAuBC,EAAA;AAE7B,SAAAC,EAAU,MAAM;AACb,UAAMC,IAAW,OAAO,YAAY,MAAM;AACvC,MAAAH,EAAqB;AAAA,QAClB,EAAE,QAAAL,GAAQ,MAAAC,EAAA;AAAA,QACV;AAAA,UACG,WAAW,CAACQ,MAAS;AAClB,oBAAQ,IAAI,4BAA4BA,CAAI,GACxCA,EAAK,WACN,OAAO,cAAcD,CAAQ,GAC7BL,EAAgB,CAACO,OACVT,MAAS,YACVS,EAAO,OAAO,gBAAgB,IAE9BA,EAAO,OAAO,eAAe,GAGzBA,EACT,GACDR,EAAA;AAAA,UAEN;AAAA,QAAA;AAAA,MACH;AAAA,IAEN,GAAG,GAAI;AAEP,WAAO,MAAM,OAAO,cAAcM,CAAQ;AAAA,EAC7C,GAAG,CAACR,GAAQC,CAAI,CAAC,GAGd,gBAAAU,EAAC,OAAA,EAAI,WAAWC,EAAQ,QACrB,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,YACrB,UAAA,gBAAAC,EAACC,KAAK,MAAK,WAAU,MAAM,GAAA,CAAI,EAAA,CAClC;AAAA,IACA,gBAAAH,EAAC,OAAA,EAAI,WAAWC,EAAQ,YACrB,UAAA;AAAA,MAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAQ,UAAU,UAAA;AAAA,QAAA;AAAA,QAAUX;AAAA,QAAK;AAAA,MAAA,GAAG;AAAA,wBACnD,OAAA,EAAI,WAAWW,EAAQ,aACrB,4BAAC,OAAA,EACE,UAAA;AAAA,QAAA,gBAAAC,EAACC,GAAA,EAAK,MAAK,SAAQ,MAAM,IAAI;AAAA,QAAE;AAAA,MAAA,EAAA,CAClC,EAAA,CACH;AAAA,IAAA,GACH;AAAA,IACA,gBAAAD,EAAC,OAAA,EAAI,WAAWD,EAAQ,aACrB,UAAA,gBAAAC,EAAC,QAAA,EAAK,WAAW,gBAAgBD,EAAQ,gBAAgB,GAAA,CAAI,EAAA,CAChE;AAAA,EAAA,GACH;AAEN;"}
|
|
@@ -4,10 +4,11 @@ import { RestoreSlim } from '../../../@types/restores';
|
|
|
4
4
|
interface PlanProgressProps {
|
|
5
5
|
plan: Plan;
|
|
6
6
|
isBackupPending: boolean;
|
|
7
|
+
isRestorePending?: boolean;
|
|
7
8
|
activeBackups: Backup[];
|
|
8
9
|
activeRestores: RestoreSlim[];
|
|
9
10
|
refetchPlan: () => void;
|
|
10
11
|
}
|
|
11
|
-
declare const PlanProgress: ({ plan, isBackupPending, activeBackups, activeRestores, refetchPlan }: PlanProgressProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
declare const PlanProgress: ({ plan, isBackupPending, isRestorePending, activeBackups, activeRestores, refetchPlan }: PlanProgressProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
13
|
export default PlanProgress;
|
|
13
14
|
//# sourceMappingURL=PlanProgress.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanProgress.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanProgress/PlanProgress.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD,UAAU,iBAAiB;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,QAAA,MAAM,YAAY,GAAI,
|
|
1
|
+
{"version":3,"file":"PlanProgress.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanProgress/PlanProgress.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKvD,UAAU,iBAAiB;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,QAAA,MAAM,YAAY,GAAI,yFAAyF,iBAAiB,4CAmE/H,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -1,45 +1,49 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { jsxs as s, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import n from "../BackupProgress/BackupProgress.js";
|
|
3
|
+
import p from "../PlanPendingBackup/PlanPendingBackup.js";
|
|
4
4
|
import a from "./PlanProgress.module.scss.js";
|
|
5
|
-
const
|
|
6
|
-
|
|
5
|
+
const k = ({ plan: c, isBackupPending: t, isRestorePending: m, activeBackups: d, activeRestores: r, refetchPlan: l }) => /* @__PURE__ */ s("div", { children: [
|
|
6
|
+
t && /* @__PURE__ */ s("div", { className: a.activeBackups, children: [
|
|
7
7
|
/* @__PURE__ */ e("div", { className: a.backupsHeader, children: /* @__PURE__ */ e("h3", { children: "Backup in Progress" }) }),
|
|
8
|
-
/* @__PURE__ */ e("div", { className: a.activeBackupsTable, children: /* @__PURE__ */ e(
|
|
8
|
+
/* @__PURE__ */ e("div", { className: a.activeBackupsTable, children: /* @__PURE__ */ e(p, { planId: c.id, onPendingDetect: () => l() }) })
|
|
9
9
|
] }),
|
|
10
|
-
d.length > 0 && /* @__PURE__ */
|
|
11
|
-
/* @__PURE__ */ e("div", { className: a.backupsHeader, children: /* @__PURE__ */
|
|
10
|
+
d.length > 0 && /* @__PURE__ */ s("div", { className: a.activeBackups, children: [
|
|
11
|
+
/* @__PURE__ */ e("div", { className: a.backupsHeader, children: /* @__PURE__ */ s("h3", { children: [
|
|
12
12
|
"Active Backups ",
|
|
13
13
|
/* @__PURE__ */ e("span", { children: d.length })
|
|
14
14
|
] }) }),
|
|
15
|
-
/* @__PURE__ */ e("div", { className: a.activeBackupsTable, children: d.map((
|
|
16
|
-
|
|
15
|
+
/* @__PURE__ */ e("div", { className: a.activeBackupsTable, children: d.map((i) => /* @__PURE__ */ e(
|
|
16
|
+
n,
|
|
17
17
|
{
|
|
18
18
|
type: "backup",
|
|
19
|
-
item:
|
|
19
|
+
item: i,
|
|
20
20
|
sourceId: c.sourceId || "",
|
|
21
21
|
sourceType: "main",
|
|
22
22
|
planId: c.id
|
|
23
23
|
},
|
|
24
|
-
|
|
24
|
+
i.id
|
|
25
25
|
)) })
|
|
26
26
|
] }),
|
|
27
|
-
|
|
27
|
+
m && /* @__PURE__ */ s("div", { className: a.activeBackups, children: [
|
|
28
|
+
/* @__PURE__ */ e("div", { className: a.backupsHeader, children: /* @__PURE__ */ e("h3", { children: "Restore in Progress" }) }),
|
|
29
|
+
/* @__PURE__ */ e("div", { className: a.activeBackupsTable, children: /* @__PURE__ */ e(p, { planId: c.id, type: "restore", onPendingDetect: () => l() }) })
|
|
30
|
+
] }),
|
|
31
|
+
r.length > 0 && /* @__PURE__ */ s("div", { className: a.activeBackups, children: [
|
|
28
32
|
/* @__PURE__ */ e("div", { className: a.backupsHeader, children: /* @__PURE__ */ e("h3", { children: "Restoring Backup" }) }),
|
|
29
|
-
/* @__PURE__ */ e("div", { className: a.activeBackupsTable, children: r.map((
|
|
30
|
-
|
|
33
|
+
/* @__PURE__ */ e("div", { className: a.activeBackupsTable, children: r.map((i) => /* @__PURE__ */ e(
|
|
34
|
+
n,
|
|
31
35
|
{
|
|
32
36
|
type: "restore",
|
|
33
|
-
item:
|
|
37
|
+
item: i,
|
|
34
38
|
sourceId: c.sourceId || "",
|
|
35
39
|
sourceType: "main",
|
|
36
40
|
planId: c.id
|
|
37
41
|
},
|
|
38
|
-
|
|
42
|
+
i.id
|
|
39
43
|
)) })
|
|
40
44
|
] })
|
|
41
45
|
] });
|
|
42
46
|
export {
|
|
43
|
-
|
|
47
|
+
k as default
|
|
44
48
|
};
|
|
45
49
|
//# sourceMappingURL=PlanProgress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanProgress.js","sources":["../../../../src/components/Plan/PlanProgress/PlanProgress.tsx"],"sourcesContent":["import { Backup } from '../../../@types/backups';\r\nimport { Plan } from '../../../@types/plans';\r\nimport { RestoreSlim } from '../../../@types/restores';\r\nimport BackupProgress from '../BackupProgress/BackupProgress';\r\nimport PlanPendingBackup from '../PlanPendingBackup/PlanPendingBackup';\r\nimport classes from './PlanProgress.module.scss';\r\n\r\ninterface PlanProgressProps {\r\n plan: Plan;\r\n isBackupPending: boolean;\r\n activeBackups: Backup[];\r\n activeRestores: RestoreSlim[];\r\n refetchPlan: () => void;\r\n}\r\n\r\nconst PlanProgress = ({ plan, isBackupPending, activeBackups, activeRestores, refetchPlan }: PlanProgressProps) => {\r\n return (\r\n <div>\r\n {isBackupPending && (\r\n <div className={classes.activeBackups}>\r\n <div className={classes.backupsHeader}>\r\n <h3>Backup in Progress</h3>\r\n </div>\r\n <div className={classes.activeBackupsTable}>\r\n <PlanPendingBackup planId={plan.id}
|
|
1
|
+
{"version":3,"file":"PlanProgress.js","sources":["../../../../src/components/Plan/PlanProgress/PlanProgress.tsx"],"sourcesContent":["import { Backup } from '../../../@types/backups';\r\nimport { Plan } from '../../../@types/plans';\r\nimport { RestoreSlim } from '../../../@types/restores';\r\nimport BackupProgress from '../BackupProgress/BackupProgress';\r\nimport PlanPendingBackup from '../PlanPendingBackup/PlanPendingBackup';\r\nimport classes from './PlanProgress.module.scss';\r\n\r\ninterface PlanProgressProps {\r\n plan: Plan;\r\n isBackupPending: boolean;\r\n isRestorePending?: boolean;\r\n activeBackups: Backup[];\r\n activeRestores: RestoreSlim[];\r\n refetchPlan: () => void;\r\n}\r\n\r\nconst PlanProgress = ({ plan, isBackupPending, isRestorePending, activeBackups, activeRestores, refetchPlan }: PlanProgressProps) => {\r\n return (\r\n <div>\r\n {isBackupPending && (\r\n <div className={classes.activeBackups}>\r\n <div className={classes.backupsHeader}>\r\n <h3>Backup in Progress</h3>\r\n </div>\r\n <div className={classes.activeBackupsTable}>\r\n <PlanPendingBackup planId={plan.id} onPendingDetect={() => refetchPlan()} />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {activeBackups.length > 0 && (\r\n <div className={classes.activeBackups}>\r\n <div className={classes.backupsHeader}>\r\n <h3>\r\n Active Backups <span>{activeBackups.length}</span>\r\n </h3>\r\n </div>\r\n <div className={classes.activeBackupsTable}>\r\n {activeBackups.map((backup) => (\r\n <BackupProgress\r\n key={backup.id}\r\n type={'backup'}\r\n item={backup}\r\n sourceId={plan.sourceId || ''}\r\n sourceType={'main'}\r\n planId={plan.id}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {isRestorePending && (\r\n <div className={classes.activeBackups}>\r\n <div className={classes.backupsHeader}>\r\n <h3>Restore in Progress</h3>\r\n </div>\r\n <div className={classes.activeBackupsTable}>\r\n <PlanPendingBackup planId={plan.id} type=\"restore\" onPendingDetect={() => refetchPlan()} />\r\n </div>\r\n </div>\r\n )}\r\n {activeRestores.length > 0 && (\r\n <div className={classes.activeBackups}>\r\n <div className={classes.backupsHeader}>\r\n <h3>Restoring Backup</h3>\r\n </div>\r\n <div className={classes.activeBackupsTable}>\r\n {activeRestores.map((restore) => (\r\n <BackupProgress\r\n key={restore.id}\r\n type={'restore'}\r\n item={restore}\r\n sourceId={plan.sourceId || ''}\r\n sourceType={'main'}\r\n planId={plan.id}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanProgress;\r\n"],"names":["PlanProgress","plan","isBackupPending","isRestorePending","activeBackups","activeRestores","refetchPlan","jsxs","classes","jsx","PlanPendingBackup","backup","BackupProgress","restore"],"mappings":";;;;AAgBA,MAAMA,IAAe,CAAC,EAAE,MAAAC,GAAM,iBAAAC,GAAiB,kBAAAC,GAAkB,eAAAC,GAAe,gBAAAC,GAAgB,aAAAC,0BAEzF,OAAA,EACG,UAAA;AAAA,EAAAJ,KACE,gBAAAK,EAAC,OAAA,EAAI,WAAWC,EAAQ,eACrB,UAAA;AAAA,IAAA,gBAAAC,EAAC,SAAI,WAAWD,EAAQ,eACrB,UAAA,gBAAAC,EAAC,MAAA,EAAG,gCAAkB,EAAA,CACzB;AAAA,IACA,gBAAAA,EAAC,OAAA,EAAI,WAAWD,EAAQ,oBACrB,UAAA,gBAAAC,EAACC,GAAA,EAAkB,QAAQT,EAAK,IAAI,iBAAiB,MAAMK,EAAA,GAAe,EAAA,CAC7E;AAAA,EAAA,GACH;AAAA,EAGFF,EAAc,SAAS,uBACpB,OAAA,EAAI,WAAWI,EAAQ,eACrB,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAQ,eACrB,4BAAC,MAAA,EAAG,UAAA;AAAA,MAAA;AAAA,MACc,gBAAAC,EAAC,QAAA,EAAM,UAAAL,EAAc,OAAA,CAAO;AAAA,IAAA,EAAA,CAC9C,EAAA,CACH;AAAA,IACA,gBAAAK,EAAC,SAAI,WAAWD,EAAQ,oBACpB,UAAAJ,EAAc,IAAI,CAACO,MACjB,gBAAAF;AAAA,MAACG;AAAA,MAAA;AAAA,QAEE,MAAM;AAAA,QACN,MAAMD;AAAA,QACN,UAAUV,EAAK,YAAY;AAAA,QAC3B,YAAY;AAAA,QACZ,QAAQA,EAAK;AAAA,MAAA;AAAA,MALRU,EAAO;AAAA,IAAA,CAOjB,EAAA,CACJ;AAAA,EAAA,GACH;AAAA,EAGFR,KACE,gBAAAI,EAAC,OAAA,EAAI,WAAWC,EAAQ,eACrB,UAAA;AAAA,IAAA,gBAAAC,EAAC,SAAI,WAAWD,EAAQ,eACrB,UAAA,gBAAAC,EAAC,MAAA,EAAG,iCAAmB,EAAA,CAC1B;AAAA,sBACC,OAAA,EAAI,WAAWD,EAAQ,oBACrB,4BAACE,GAAA,EAAkB,QAAQT,EAAK,IAAI,MAAK,WAAU,iBAAiB,MAAMK,EAAA,GAAe,EAAA,CAC5F;AAAA,EAAA,GACH;AAAA,EAEFD,EAAe,SAAS,uBACrB,OAAA,EAAI,WAAWG,EAAQ,eACrB,UAAA;AAAA,IAAA,gBAAAC,EAAC,SAAI,WAAWD,EAAQ,eACrB,UAAA,gBAAAC,EAAC,MAAA,EAAG,8BAAgB,EAAA,CACvB;AAAA,IACA,gBAAAA,EAAC,SAAI,WAAWD,EAAQ,oBACpB,UAAAH,EAAe,IAAI,CAACQ,MAClB,gBAAAJ;AAAA,MAACG;AAAA,MAAA;AAAA,QAEE,MAAM;AAAA,QACN,MAAMC;AAAA,QACN,UAAUZ,EAAK,YAAY;AAAA,QAC3B,YAAY;AAAA,QACZ,QAAQA,EAAK;AAAA,MAAA;AAAA,MALRY,EAAQ;AAAA,IAAA,CAOlB,EAAA,CACJ;AAAA,EAAA,EAAA,CACH;AAAA,GAEN;"}
|
|
@@ -17,7 +17,7 @@ const se = ({
|
|
|
17
17
|
sourceId: S,
|
|
18
18
|
sourceType: B
|
|
19
19
|
}) => {
|
|
20
|
-
const [a, p] = c(!1), [n, b] = c(!1), [h, u] = c(!1), [w,
|
|
20
|
+
const [a, p] = c(!1), [n, b] = c(!1), [h, u] = c(!1), [w, T] = c(!1), M = O(), v = V(), x = (s) => {
|
|
21
21
|
console.log("remove :", s.id), v.mutate(s.id, {
|
|
22
22
|
onError: () => {
|
|
23
23
|
D.error("Failed to Remove Restore Entry");
|
|
@@ -39,13 +39,13 @@ const se = ({
|
|
|
39
39
|
] }),
|
|
40
40
|
/* @__PURE__ */ o("div", { className: t.backupsTableContent, children: [
|
|
41
41
|
R.filter((s) => s.status !== "started").map((s) => {
|
|
42
|
-
const { id: i, backupId: A, started: d, ended: l, config:
|
|
42
|
+
const { id: i, backupId: A, started: d, ended: l, config: k, status: P, taskStats: r, errorMsg: y } = s, N = d && l && new Date(l).getTime() / 1e3 - new Date(d).getTime() / 1e3;
|
|
43
43
|
return /* @__PURE__ */ o(
|
|
44
44
|
"div",
|
|
45
45
|
{
|
|
46
46
|
className: `${t.backupsTableRow} ${a && a === i ? t.backupsTableRowActive : ""}`,
|
|
47
47
|
children: [
|
|
48
|
-
/* @__PURE__ */ o("div", { className: t.
|
|
48
|
+
/* @__PURE__ */ o("div", { className: t.restoreTitle, onClick: () => !f && T(i), children: [
|
|
49
49
|
/* @__PURE__ */ e(m, { type: f ? "sync" : "box", size: 14 }),
|
|
50
50
|
" ",
|
|
51
51
|
f ? "sync" : "backup",
|
|
@@ -63,7 +63,7 @@ const se = ({
|
|
|
63
63
|
}
|
|
64
64
|
),
|
|
65
65
|
/* @__PURE__ */ e("div", { title: N + "s", children: F(N) }),
|
|
66
|
-
/* @__PURE__ */ e("div", { className: t.target, "data-tooltip-id": "htmlToolTip", "data-tooltip-html": `${
|
|
66
|
+
/* @__PURE__ */ e("div", { className: t.target, "data-tooltip-id": "htmlToolTip", "data-tooltip-html": `${k.target}`, children: k.target || "Original" }),
|
|
67
67
|
/* @__PURE__ */ e("div", { "data-tooltip-id": "", "data-tooltip-html": q((r == null ? void 0 : r.bytes_restored) || 0), children: j((r == null ? void 0 : r.files_restored) || 0) }),
|
|
68
68
|
/* @__PURE__ */ e("div", { title: K(l || d), children: l ? C(new Date(l)) : C(new Date(d)) }),
|
|
69
69
|
/* @__PURE__ */ e("div", { className: t.snapOptsBtn, children: /* @__PURE__ */ e("button", { onClick: () => p(a && a === i ? !1 : i), children: /* @__PURE__ */ e(m, { type: "dots-vertical", size: 12 }) }) }),
|
|
@@ -133,7 +133,7 @@ const se = ({
|
|
|
133
133
|
planId: g,
|
|
134
134
|
sourceId: S,
|
|
135
135
|
sourceType: B,
|
|
136
|
-
close: () =>
|
|
136
|
+
close: () => T(!1)
|
|
137
137
|
}
|
|
138
138
|
)
|
|
139
139
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Restores.js","sources":["../../../../src/components/Plan/Restores/Restores.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { toast } from 'react-toastify';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\nimport { RestoreSlim } from '../../../@types/restores';\r\nimport { formatBytes, formatDateTime, formatDuration, formatNumberToK, timeAgo } from '../../../utils/helpers';\r\nimport classes from '../Backups/Backups.module.scss';\r\nimport StatusLabel from '../../common/StatusLabel/StatusLabel';\r\nimport { useDeleteRestore } from '../../../services/restores';\r\nimport BackupEvents from '../BackupEvents/BackupEvents';\r\nimport RestoreChangeViewer from '../../Restore/RestoreChangeViewer/RestoreChangeViewer';\r\n\r\nconst Restores = ({\r\n planId,\r\n method,\r\n restores = [],\r\n sourceId,\r\n sourceType,\r\n}: {\r\n planId: string;\r\n method: string;\r\n sourceId: string;\r\n sourceType: string;\r\n restores: RestoreSlim[];\r\n}) => {\r\n const [showSnapOptions, setShowSnapOptions] = useState<false | string>(false);\r\n const [previewRestore, setPreviewRestore] = useState<false | RestoreSlim>(false);\r\n const [showDeleteModal, setShowDeleteModal] = useState<RestoreSlim | false>(false);\r\n const [showRestoreEvents, setShowRestoreEvents] = useState<false | string>(false);\r\n const queryClient = useQueryClient();\r\n const deleteRestoreMutation = useDeleteRestore();\r\n\r\n const removeRestore = (restore: RestoreSlim) => {\r\n console.log('remove :', restore.id);\r\n deleteRestoreMutation.mutate(restore.id, {\r\n onError: () => {\r\n toast.error(`Failed to Remove Restore Entry`);\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n toast.success(`Restore Entry Removed Successfully.`, { autoClose: 5000 });\r\n setShowDeleteModal(false);\r\n },\r\n });\r\n };\r\n\r\n const isSync = method === 'sync';\r\n\r\n return (\r\n <div className={classes.backupsTable}>\r\n <div className={classes.backupsTableHead}>\r\n <div>Restored Backup</div>\r\n <div>Status</div>\r\n <div>Duration</div>\r\n <div>Restore Path</div>\r\n <div>Files</div>\r\n <div>Date</div>\r\n <div></div>\r\n </div>\r\n <div className={classes.backupsTableContent}>\r\n {restores\r\n .filter((s) => s.status !== 'started')\r\n .map((restore) => {\r\n const { id, backupId, started, ended, config, status, taskStats, errorMsg } = restore;\r\n const duration = started && ended && new Date(ended).getTime() / 1000 - new Date(started).getTime() / 1000;\r\n return (\r\n <div\r\n key={id}\r\n className={`${classes.backupsTableRow} ${showSnapOptions && showSnapOptions === id ? classes.backupsTableRowActive : ''}`}\r\n >\r\n <div className={classes.backupTitle} onClick={() => !isSync && setShowRestoreEvents(id)}>\r\n <Icon type={isSync ? 'sync' : 'box'} size={14} /> {isSync ? 'sync' : 'backup'}-{backupId}\r\n </div>\r\n <div\r\n className={classes.status}\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-html={`<div><string>Error</string>: ${errorMsg}</div>`}\r\n data-tooltip-hidden={!errorMsg}\r\n >\r\n <StatusLabel status={status} hasError={!!errorMsg} />\r\n </div>\r\n <div title={duration + 's'}>{formatDuration(duration)}</div>\r\n <div className={classes.target} data-tooltip-id=\"htmlToolTip\" data-tooltip-html={`${config.target}`}>\r\n {config.target || 'Original'}\r\n </div>\r\n <div data-tooltip-id=\"\" data-tooltip-html={formatBytes(taskStats?.bytes_restored || 0)}>\r\n {formatNumberToK(taskStats?.files_restored || 0)}\r\n </div>\r\n <div title={formatDateTime(ended || started)}>{ended ? timeAgo(new Date(ended)) : timeAgo(new Date(started))}</div>\r\n <div className={classes.snapOptsBtn}>\r\n <button onClick={() => setShowSnapOptions(showSnapOptions && showSnapOptions === id ? false : id)}>\r\n <Icon type=\"dots-vertical\" size={12} />\r\n </button>\r\n </div>\r\n {showSnapOptions === id && (\r\n <div className={classes.settings}>\r\n <button\r\n onClick={() => {\r\n setPreviewRestore(restore);\r\n setShowSnapOptions(false);\r\n }}\r\n >\r\n <Icon type={'eye'} size={14} /> View Changes\r\n </button>\r\n <button\r\n onClick={() => {\r\n setShowDeleteModal(restore);\r\n setShowSnapOptions(false);\r\n }}\r\n >\r\n <Icon type=\"trash\" size={14} /> Remove\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n {restores.length === 0 && <div className={classes.noBackups}>No Backups Restored Yet.</div>}\r\n </div>\r\n {showDeleteModal && (\r\n <ActionModal\r\n title=\"Remove Restore Entry\"\r\n message={\r\n <>\r\n Are you sure you want to remove this Restore entry <strong>\"restore-{showDeleteModal.id}\"</strong> from the database?\r\n </>\r\n }\r\n closeModal={() => !deleteRestoreMutation.isPending && setShowDeleteModal(false)}\r\n width=\"400px\"\r\n primaryAction={{\r\n title: 'Yes, Remove Restore',\r\n type: 'danger',\r\n icon: 'trash',\r\n isPending: deleteRestoreMutation.isPending,\r\n action: () => removeRestore(showDeleteModal),\r\n }}\r\n />\r\n )}\r\n {previewRestore && previewRestore?.taskStats && <RestoreChangeViewer restore={previewRestore} close={() => setPreviewRestore(false)} />}\r\n {showRestoreEvents && (\r\n <BackupEvents\r\n id={showRestoreEvents}\r\n type=\"restore\"\r\n planId={planId}\r\n sourceId={sourceId}\r\n sourceType={sourceType}\r\n close={() => setShowRestoreEvents(false)}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Restores;\r\n"],"names":["Restores","planId","method","restores","sourceId","sourceType","showSnapOptions","setShowSnapOptions","useState","previewRestore","setPreviewRestore","showDeleteModal","setShowDeleteModal","showRestoreEvents","setShowRestoreEvents","queryClient","useQueryClient","deleteRestoreMutation","useDeleteRestore","removeRestore","restore","toast","isSync","jsxs","classes","jsx","id","backupId","started","ended","config","status","taskStats","errorMsg","duration","Icon","StatusLabel","formatDuration","formatBytes","formatNumberToK","formatDateTime","timeAgo","ActionModal","Fragment","RestoreChangeViewer","BackupEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Restores.js","sources":["../../../../src/components/Plan/Restores/Restores.tsx"],"sourcesContent":["import { useState } from 'react';\r\nimport { toast } from 'react-toastify';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\nimport { RestoreSlim } from '../../../@types/restores';\r\nimport { formatBytes, formatDateTime, formatDuration, formatNumberToK, timeAgo } from '../../../utils/helpers';\r\nimport classes from '../Backups/Backups.module.scss';\r\nimport StatusLabel from '../../common/StatusLabel/StatusLabel';\r\nimport { useDeleteRestore } from '../../../services/restores';\r\nimport BackupEvents from '../BackupEvents/BackupEvents';\r\nimport RestoreChangeViewer from '../../Restore/RestoreChangeViewer/RestoreChangeViewer';\r\n\r\nconst Restores = ({\r\n planId,\r\n method,\r\n restores = [],\r\n sourceId,\r\n sourceType,\r\n}: {\r\n planId: string;\r\n method: string;\r\n sourceId: string;\r\n sourceType: string;\r\n restores: RestoreSlim[];\r\n}) => {\r\n const [showSnapOptions, setShowSnapOptions] = useState<false | string>(false);\r\n const [previewRestore, setPreviewRestore] = useState<false | RestoreSlim>(false);\r\n const [showDeleteModal, setShowDeleteModal] = useState<RestoreSlim | false>(false);\r\n const [showRestoreEvents, setShowRestoreEvents] = useState<false | string>(false);\r\n const queryClient = useQueryClient();\r\n const deleteRestoreMutation = useDeleteRestore();\r\n\r\n const removeRestore = (restore: RestoreSlim) => {\r\n console.log('remove :', restore.id);\r\n deleteRestoreMutation.mutate(restore.id, {\r\n onError: () => {\r\n toast.error(`Failed to Remove Restore Entry`);\r\n },\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: ['plan', planId] });\r\n toast.success(`Restore Entry Removed Successfully.`, { autoClose: 5000 });\r\n setShowDeleteModal(false);\r\n },\r\n });\r\n };\r\n\r\n const isSync = method === 'sync';\r\n\r\n return (\r\n <div className={classes.backupsTable}>\r\n <div className={classes.backupsTableHead}>\r\n <div>Restored Backup</div>\r\n <div>Status</div>\r\n <div>Duration</div>\r\n <div>Restore Path</div>\r\n <div>Files</div>\r\n <div>Date</div>\r\n <div></div>\r\n </div>\r\n <div className={classes.backupsTableContent}>\r\n {restores\r\n .filter((s) => s.status !== 'started')\r\n .map((restore) => {\r\n const { id, backupId, started, ended, config, status, taskStats, errorMsg } = restore;\r\n const duration = started && ended && new Date(ended).getTime() / 1000 - new Date(started).getTime() / 1000;\r\n return (\r\n <div\r\n key={id}\r\n className={`${classes.backupsTableRow} ${showSnapOptions && showSnapOptions === id ? classes.backupsTableRowActive : ''}`}\r\n >\r\n <div className={classes.restoreTitle} onClick={() => !isSync && setShowRestoreEvents(id)}>\r\n <Icon type={isSync ? 'sync' : 'box'} size={14} /> {isSync ? 'sync' : 'backup'}-{backupId}\r\n </div>\r\n <div\r\n className={classes.status}\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-html={`<div><string>Error</string>: ${errorMsg}</div>`}\r\n data-tooltip-hidden={!errorMsg}\r\n >\r\n <StatusLabel status={status} hasError={!!errorMsg} />\r\n </div>\r\n <div title={duration + 's'}>{formatDuration(duration)}</div>\r\n <div className={classes.target} data-tooltip-id=\"htmlToolTip\" data-tooltip-html={`${config.target}`}>\r\n {config.target || 'Original'}\r\n </div>\r\n <div data-tooltip-id=\"\" data-tooltip-html={formatBytes(taskStats?.bytes_restored || 0)}>\r\n {formatNumberToK(taskStats?.files_restored || 0)}\r\n </div>\r\n <div title={formatDateTime(ended || started)}>{ended ? timeAgo(new Date(ended)) : timeAgo(new Date(started))}</div>\r\n <div className={classes.snapOptsBtn}>\r\n <button onClick={() => setShowSnapOptions(showSnapOptions && showSnapOptions === id ? false : id)}>\r\n <Icon type=\"dots-vertical\" size={12} />\r\n </button>\r\n </div>\r\n {showSnapOptions === id && (\r\n <div className={classes.settings}>\r\n <button\r\n onClick={() => {\r\n setPreviewRestore(restore);\r\n setShowSnapOptions(false);\r\n }}\r\n >\r\n <Icon type={'eye'} size={14} /> View Changes\r\n </button>\r\n <button\r\n onClick={() => {\r\n setShowDeleteModal(restore);\r\n setShowSnapOptions(false);\r\n }}\r\n >\r\n <Icon type=\"trash\" size={14} /> Remove\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n {restores.length === 0 && <div className={classes.noBackups}>No Backups Restored Yet.</div>}\r\n </div>\r\n {showDeleteModal && (\r\n <ActionModal\r\n title=\"Remove Restore Entry\"\r\n message={\r\n <>\r\n Are you sure you want to remove this Restore entry <strong>\"restore-{showDeleteModal.id}\"</strong> from the database?\r\n </>\r\n }\r\n closeModal={() => !deleteRestoreMutation.isPending && setShowDeleteModal(false)}\r\n width=\"400px\"\r\n primaryAction={{\r\n title: 'Yes, Remove Restore',\r\n type: 'danger',\r\n icon: 'trash',\r\n isPending: deleteRestoreMutation.isPending,\r\n action: () => removeRestore(showDeleteModal),\r\n }}\r\n />\r\n )}\r\n {previewRestore && previewRestore?.taskStats && <RestoreChangeViewer restore={previewRestore} close={() => setPreviewRestore(false)} />}\r\n {showRestoreEvents && (\r\n <BackupEvents\r\n id={showRestoreEvents}\r\n type=\"restore\"\r\n planId={planId}\r\n sourceId={sourceId}\r\n sourceType={sourceType}\r\n close={() => setShowRestoreEvents(false)}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Restores;\r\n"],"names":["Restores","planId","method","restores","sourceId","sourceType","showSnapOptions","setShowSnapOptions","useState","previewRestore","setPreviewRestore","showDeleteModal","setShowDeleteModal","showRestoreEvents","setShowRestoreEvents","queryClient","useQueryClient","deleteRestoreMutation","useDeleteRestore","removeRestore","restore","toast","isSync","jsxs","classes","jsx","id","backupId","started","ended","config","status","taskStats","errorMsg","duration","Icon","StatusLabel","formatDuration","formatBytes","formatNumberToK","formatDateTime","timeAgo","ActionModal","Fragment","RestoreChangeViewer","BackupEvents"],"mappings":"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"}
|