@plutonhq/core-frontend 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/@types/backups.d.ts +26 -0
- package/dist-lib/@types/backups.d.ts.map +1 -1
- package/dist-lib/@types/devices.d.ts +7 -0
- package/dist-lib/@types/devices.d.ts.map +1 -1
- package/dist-lib/@types/plans.d.ts +21 -1
- package/dist-lib/@types/plans.d.ts.map +1 -1
- package/dist-lib/@types/restores.d.ts +2 -0
- package/dist-lib/@types/restores.d.ts.map +1 -1
- package/dist-lib/components/Device/DeviceBackups/DeviceBackups.d.ts +3 -2
- package/dist-lib/components/Device/DeviceBackups/DeviceBackups.d.ts.map +1 -1
- package/dist-lib/components/Device/DeviceBackups/DeviceBackups.js +73 -85
- package/dist-lib/components/Device/DeviceBackups/DeviceBackups.js.map +1 -1
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.d.ts.map +1 -1
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.js +88 -50
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.js.map +1 -1
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.module.scss.js +70 -38
- package/dist-lib/components/Plan/BackupEvents/BackupEvents.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.d.ts.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js +166 -123
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.js.map +1 -1
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js +64 -30
- package/dist-lib/components/Plan/BackupProgress/BackupProgress.module.scss.js.map +1 -1
- package/dist-lib/components/Plan/Backups/Backups.d.ts +8 -1
- package/dist-lib/components/Plan/Backups/Backups.d.ts.map +1 -1
- package/dist-lib/components/Plan/Backups/Backups.js +154 -125
- package/dist-lib/components/Plan/Backups/Backups.js.map +1 -1
- package/dist-lib/components/Plan/EditPlan/EditPlan.d.ts.map +1 -1
- package/dist-lib/components/Plan/EditPlan/EditPlan.js +11 -10
- package/dist-lib/components/Plan/EditPlan/EditPlan.js.map +1 -1
- package/dist-lib/components/Plan/Mirrors/MirrorDetails.d.ts +12 -0
- package/dist-lib/components/Plan/Mirrors/MirrorDetails.d.ts.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorDetails.js +68 -0
- package/dist-lib/components/Plan/Mirrors/MirrorDetails.js.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorDetails.module.scss.js +26 -0
- package/dist-lib/components/Plan/Mirrors/MirrorDetails.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.d.ts +11 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.d.ts.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.js +38 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.js.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.module.scss.js +16 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStatusBadge.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.d.ts +14 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.d.ts.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.js +54 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.js.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.module.scss.js +26 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelector.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelectorModal.d.ts +15 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelectorModal.d.ts.map +1 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelectorModal.js +34 -0
- package/dist-lib/components/Plan/Mirrors/MirrorStorageSelectorModal.js.map +1 -0
- package/dist-lib/components/Plan/PlanBackups/PlanBackups.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanBackups/PlanBackups.js +20 -17
- package/dist-lib/components/Plan/PlanBackups/PlanBackups.js.map +1 -1
- package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts +2 -1
- package/dist-lib/components/Plan/PlanForm/PlanForm.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanForm/PlanForm.js +85 -58
- package/dist-lib/components/Plan/PlanForm/PlanForm.js.map +1 -1
- package/dist-lib/components/Plan/PlanItems/PlanItem.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanItems/PlanItem.js +58 -59
- package/dist-lib/components/Plan/PlanItems/PlanItem.js.map +1 -1
- package/dist-lib/components/Plan/PlanRemoveModal/PlanRemoveModal.js +8 -8
- package/dist-lib/components/Plan/PlanRemoveModal/PlanRemoveModal.js.map +1 -1
- package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.d.ts +14 -0
- package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.d.ts.map +1 -0
- package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.js +290 -0
- package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.js.map +1 -0
- package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.module.scss.js +26 -0
- package/dist-lib/components/Plan/PlanSettings/PlanReplicationSettings.module.scss.js.map +1 -0
- package/dist-lib/components/Plan/PlanStats/PlanStats.d.ts.map +1 -1
- package/dist-lib/components/Plan/PlanStats/PlanStats.js +41 -42
- package/dist-lib/components/Plan/PlanStats/PlanStats.js.map +1 -1
- package/dist-lib/components/Plan/PlanStats/PlanStats.module.scss.js +5 -5
- package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.d.ts +15 -0
- package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.d.ts.map +1 -0
- package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.js +69 -0
- package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.js.map +1 -0
- package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.module.scss.js +16 -0
- package/dist-lib/components/Plan/PlanStorageInfo/PlanStorageInfo.module.scss.js.map +1 -0
- package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.d.ts.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js +36 -34
- package/dist-lib/components/Restore/RestoreWizard/RestoreConfirmStep.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.d.ts.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js +7 -5
- package/dist-lib/components/Restore/RestoreWizard/RestorePreviewStep.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreSettingsStep.d.ts +12 -4
- package/dist-lib/components/Restore/RestoreWizard/RestoreSettingsStep.d.ts.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreSettingsStep.js +44 -32
- package/dist-lib/components/Restore/RestoreWizard/RestoreSettingsStep.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.d.ts +5 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.d.ts.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.js +48 -44
- package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.js.map +1 -1
- package/dist-lib/components/Restore/RestoreWizard/RestoreWizard.module.scss.js +32 -32
- package/dist-lib/components/Settings/GeneralSettings/GeneralSettings.js +14 -14
- package/dist-lib/components/Settings/GeneralSettings/GeneralSettings.js.map +1 -1
- package/dist-lib/components/Settings/IntegrationSettings/IntegrationSettings.d.ts.map +1 -1
- package/dist-lib/components/Settings/IntegrationSettings/IntegrationSettings.js +28 -19
- package/dist-lib/components/Settings/IntegrationSettings/IntegrationSettings.js.map +1 -1
- package/dist-lib/components/common/Icon/Icon.d.ts.map +1 -1
- package/dist-lib/components/common/Icon/Icon.js +11 -0
- package/dist-lib/components/common/Icon/Icon.js.map +1 -1
- package/dist-lib/components/common/PageHeader/PageHeader.module.scss.js +6 -6
- package/dist-lib/components/index.d.ts +4 -0
- package/dist-lib/components/index.d.ts.map +1 -1
- package/dist-lib/components.js +86 -78
- package/dist-lib/components.js.map +1 -1
- package/dist-lib/hooks/usePwaAutoUpdate.d.ts +11 -2
- package/dist-lib/hooks/usePwaAutoUpdate.d.ts.map +1 -1
- package/dist-lib/hooks/usePwaAutoUpdate.js +32 -10
- package/dist-lib/hooks/usePwaAutoUpdate.js.map +1 -1
- package/dist-lib/router.d.ts.map +1 -1
- package/dist-lib/router.js +46 -35
- package/dist-lib/router.js.map +1 -1
- package/dist-lib/routes/DeviceSingle/DeviceSingle.d.ts.map +1 -1
- package/dist-lib/routes/DeviceSingle/DeviceSingle.js +40 -40
- package/dist-lib/routes/DeviceSingle/DeviceSingle.js.map +1 -1
- package/dist-lib/services/backups.d.ts +15 -2
- package/dist-lib/services/backups.d.ts.map +1 -1
- package/dist-lib/services/backups.js +119 -100
- package/dist-lib/services/backups.js.map +1 -1
- package/dist-lib/services/plans.d.ts +14 -0
- package/dist-lib/services/plans.d.ts.map +1 -1
- package/dist-lib/services/plans.js +160 -129
- package/dist-lib/services/plans.js.map +1 -1
- package/dist-lib/services/restores.d.ts +10 -2
- package/dist-lib/services/restores.d.ts.map +1 -1
- package/dist-lib/services/restores.js +61 -57
- package/dist-lib/services/restores.js.map +1 -1
- package/dist-lib/services/users.d.ts.map +1 -1
- package/dist-lib/services/users.js +32 -32
- package/dist-lib/services/users.js.map +1 -1
- package/dist-lib/services.js +107 -103
- package/dist-lib/styles/core-frontend.css +1 -1
- package/dist-lib/utils/progressHelpers.d.ts +12 -1
- package/dist-lib/utils/progressHelpers.d.ts.map +1 -1
- package/dist-lib/utils/progressHelpers.js +121 -63
- package/dist-lib/utils/progressHelpers.js.map +1 -1
- package/dist-lib/utils.js +29 -28
- package/package.json +1 -1
- package/src/@types/backups.ts +28 -0
- package/src/@types/devices.ts +8 -0
- package/src/@types/plans.ts +23 -1
- package/src/@types/restores.ts +2 -0
- package/src/components/Device/DeviceBackups/DeviceBackups.tsx +11 -36
- package/src/components/Plan/BackupEvents/BackupEvents.module.scss +65 -0
- package/src/components/Plan/BackupEvents/BackupEvents.tsx +65 -4
- package/src/components/Plan/BackupProgress/BackupProgress.module.scss +121 -3
- package/src/components/Plan/BackupProgress/BackupProgress.tsx +149 -71
- package/src/components/Plan/Backups/Backups.tsx +52 -4
- package/src/components/Plan/EditPlan/EditPlan.tsx +1 -0
- package/src/components/Plan/Mirrors/MirrorDetails.module.scss +76 -0
- package/src/components/Plan/Mirrors/MirrorDetails.tsx +100 -0
- package/src/components/Plan/Mirrors/MirrorStatusBadge.module.scss +25 -0
- package/src/components/Plan/Mirrors/MirrorStatusBadge.tsx +65 -0
- package/src/components/Plan/Mirrors/MirrorStorageSelector.module.scss +97 -0
- package/src/components/Plan/Mirrors/MirrorStorageSelector.tsx +70 -0
- package/src/components/Plan/Mirrors/MirrorStorageSelectorModal.tsx +40 -0
- package/src/components/Plan/PlanBackups/PlanBackups.tsx +4 -1
- package/src/components/Plan/PlanForm/PlanForm.tsx +30 -3
- package/src/components/Plan/PlanItems/PlanItem.tsx +3 -3
- package/src/components/Plan/PlanRemoveModal/PlanRemoveModal.tsx +1 -1
- package/src/components/Plan/PlanSettings/PlanReplicationSettings.module.scss +105 -0
- package/src/components/Plan/PlanSettings/PlanReplicationSettings.tsx +334 -0
- package/src/components/Plan/PlanStats/PlanStats.module.scss +1 -1
- package/src/components/Plan/PlanStats/PlanStats.tsx +8 -8
- package/src/components/Plan/PlanStorageInfo/PlanStorageInfo.module.scss +43 -0
- package/src/components/Plan/PlanStorageInfo/PlanStorageInfo.tsx +83 -0
- package/src/components/Restore/RestoreWizard/RestoreConfirmStep.tsx +2 -0
- package/src/components/Restore/RestoreWizard/RestorePreviewStep.tsx +2 -0
- package/src/components/Restore/RestoreWizard/RestoreSettingsStep.tsx +36 -13
- package/src/components/Restore/RestoreWizard/RestoreWizard.module.scss +4 -0
- package/src/components/Restore/RestoreWizard/RestoreWizard.tsx +9 -1
- package/src/components/Settings/GeneralSettings/GeneralSettings.tsx +1 -1
- package/src/components/Settings/IntegrationSettings/IntegrationSettings.tsx +9 -2
- package/src/components/common/Icon/Icon.tsx +10 -1
- package/src/components/common/PageHeader/PageHeader.module.scss +3 -0
- package/src/components/index.ts +6 -0
- package/src/hooks/usePwaAutoUpdate.ts +51 -11
- package/src/router.tsx +26 -17
- package/src/routes/DeviceSingle/DeviceSingle.tsx +3 -3
- package/src/services/backups.ts +32 -9
- package/src/services/plans.ts +45 -0
- package/src/services/restores.ts +10 -2
- package/src/services/users.ts +14 -5
- package/src/utils/progressHelpers.ts +85 -1
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { jsxs as s, jsx as r } from "react/jsx-runtime";
|
|
2
|
+
import { useState as I, useCallback as J } from "react";
|
|
3
|
+
import g from "../../common/Icon/Icon.js";
|
|
4
|
+
import w from "../../common/form/StoragePicker/StoragePicker.js";
|
|
5
|
+
import N from "../../common/form/Toggle/Toggle.js";
|
|
6
|
+
import f from "../AddPlan/AddPlan.module.scss.js";
|
|
7
|
+
import n from "./PlanReplicationSettings.module.scss.js";
|
|
8
|
+
import K from "../../common/ActionModal/ActionModal.js";
|
|
9
|
+
import { useDeleteReplicationStorage as Q } from "../../../services/plans.js";
|
|
10
|
+
import { toast as A } from "react-toastify";
|
|
11
|
+
import { nanoid as z } from "nanoid";
|
|
12
|
+
const W = {
|
|
13
|
+
enabled: !1,
|
|
14
|
+
concurrent: !1,
|
|
15
|
+
storages: []
|
|
16
|
+
}, P = 2, ne = ({
|
|
17
|
+
replication: B,
|
|
18
|
+
primaryStorageId: C,
|
|
19
|
+
primaryStoragePath: D,
|
|
20
|
+
deviceId: k,
|
|
21
|
+
isEditing: p = !1,
|
|
22
|
+
planID: M,
|
|
23
|
+
maxReplications: v,
|
|
24
|
+
onUpdate: l
|
|
25
|
+
}) => {
|
|
26
|
+
const [d, h] = I([]), [T, u] = I(!1), [R, b] = I(!1), c = Q(), o = B || W, H = J(
|
|
27
|
+
(e, t, a, i) => {
|
|
28
|
+
if (!e || !t) return !1;
|
|
29
|
+
const S = o.storages.some(
|
|
30
|
+
(m, y) => (a === void 0 || y !== a) && m.storageId === e && m.storagePath === t
|
|
31
|
+
), G = d.some(
|
|
32
|
+
(m, y) => (i === void 0 || y !== i) && m.storageId === e && m.storagePath === t
|
|
33
|
+
);
|
|
34
|
+
return S || G;
|
|
35
|
+
},
|
|
36
|
+
[o.storages, d]
|
|
37
|
+
), _ = (e) => {
|
|
38
|
+
l({ ...o, enabled: e });
|
|
39
|
+
}, j = (e) => {
|
|
40
|
+
l({ ...o, concurrent: e });
|
|
41
|
+
}, V = () => {
|
|
42
|
+
if (p) {
|
|
43
|
+
const e = v ?? P;
|
|
44
|
+
if (o.storages.length + d.length >= e) return;
|
|
45
|
+
h([...d, { replicationId: z(), storageId: "", storagePath: "", storageType: "", addedAt: Date.now() }]);
|
|
46
|
+
} else {
|
|
47
|
+
const e = v ?? P;
|
|
48
|
+
if (o.storages.length >= e) return;
|
|
49
|
+
l({
|
|
50
|
+
...o,
|
|
51
|
+
storages: [...o.storages, { replicationId: z(), storageId: "", storagePath: "", storageType: "", addedAt: Date.now() }]
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}, O = (e, t) => {
|
|
55
|
+
h((a) => {
|
|
56
|
+
const i = [...a];
|
|
57
|
+
return i[e] = t, i;
|
|
58
|
+
});
|
|
59
|
+
}, E = (e) => {
|
|
60
|
+
const t = d[e];
|
|
61
|
+
if (t.storageId) {
|
|
62
|
+
if (t.storageId === C && t.storagePath === D) {
|
|
63
|
+
A.error("Cannot replicate to the same storage as the primary backup.");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (H(t.storageId, t.storagePath, void 0, e)) {
|
|
67
|
+
A.error("This storage destination is already added.");
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
h((a) => a.filter((i, S) => S !== e)), l({ ...o, storages: [...o.storages, t] });
|
|
71
|
+
}
|
|
72
|
+
}, L = (e) => {
|
|
73
|
+
h((t) => t.filter((a, i) => i !== e));
|
|
74
|
+
}, X = (e, t) => {
|
|
75
|
+
const a = [...o.storages];
|
|
76
|
+
a[e] = t, l({ ...o, storages: a });
|
|
77
|
+
}, Y = (e) => {
|
|
78
|
+
const t = o.storages.filter((a, i) => i !== e);
|
|
79
|
+
l({ ...o, storages: t });
|
|
80
|
+
}, q = () => {
|
|
81
|
+
if (typeof R == "object" && M) {
|
|
82
|
+
const e = R;
|
|
83
|
+
c.mutate(
|
|
84
|
+
{
|
|
85
|
+
planID: M,
|
|
86
|
+
storageID: e.storageId,
|
|
87
|
+
removeData: T,
|
|
88
|
+
storagePath: e.storagePath,
|
|
89
|
+
replicationId: e.replicationId
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
onSuccess: () => {
|
|
93
|
+
const t = o.storages.filter((a) => a.replicationId !== e.replicationId);
|
|
94
|
+
l({ ...o, storages: t, ...t.length === 0 && { enabled: !1 } }), b(!1), u(!1), c.reset();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}, F = (e) => {
|
|
100
|
+
u(!1), c.reset(), b(e);
|
|
101
|
+
};
|
|
102
|
+
return /* @__PURE__ */ s("div", { className: f.field, children: [
|
|
103
|
+
/* @__PURE__ */ s("div", { className: n.mirrorSection, children: [
|
|
104
|
+
/* @__PURE__ */ r(
|
|
105
|
+
N,
|
|
106
|
+
{
|
|
107
|
+
label: "Enable Replication",
|
|
108
|
+
description: "Replicate backups to additional storage destinations for redundancy (3-2-1 backup strategy)",
|
|
109
|
+
fieldValue: o.enabled,
|
|
110
|
+
onUpdate: _
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
o.enabled && /* @__PURE__ */ s("div", { className: n.mirrorSettings, children: [
|
|
114
|
+
o.storages.map((e, t) => /* @__PURE__ */ s("div", { className: n.mirrorDestination, children: [
|
|
115
|
+
/* @__PURE__ */ s("div", { className: n.mirrorHeader, children: [
|
|
116
|
+
/* @__PURE__ */ s("label", { className: f.label, children: [
|
|
117
|
+
"Replication Destination ",
|
|
118
|
+
t + 1
|
|
119
|
+
] }),
|
|
120
|
+
/* @__PURE__ */ s("div", { className: n.mirrorHeaderRight, children: [
|
|
121
|
+
o.storages.length > 1 && /* @__PURE__ */ s("div", { className: n.storagePositionControls, children: [
|
|
122
|
+
/* @__PURE__ */ r(
|
|
123
|
+
"button",
|
|
124
|
+
{
|
|
125
|
+
title: "Move Up",
|
|
126
|
+
disabled: t === 0,
|
|
127
|
+
onClick: () => {
|
|
128
|
+
const a = [...o.storages || []], [i] = a.splice(t, 1);
|
|
129
|
+
a.splice(t - 1, 0, i), l({ ...o, storages: a });
|
|
130
|
+
},
|
|
131
|
+
children: /* @__PURE__ */ r(g, { type: "caret-up", size: 14 })
|
|
132
|
+
}
|
|
133
|
+
),
|
|
134
|
+
/* @__PURE__ */ r(
|
|
135
|
+
"button",
|
|
136
|
+
{
|
|
137
|
+
title: "Move Down",
|
|
138
|
+
disabled: t === o.storages.length - 1,
|
|
139
|
+
onClick: () => {
|
|
140
|
+
const a = [...o.storages || []], [i] = a.splice(t, 1);
|
|
141
|
+
a.splice(t + 1, 0, i), l({ ...o, storages: a });
|
|
142
|
+
},
|
|
143
|
+
children: /* @__PURE__ */ r(g, { type: "caret-down", size: 14 })
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
] }),
|
|
147
|
+
/* @__PURE__ */ s(
|
|
148
|
+
"button",
|
|
149
|
+
{
|
|
150
|
+
className: n.removeBtn,
|
|
151
|
+
onClick: () => p ? F(e) : Y(t),
|
|
152
|
+
title: "Remove replication destination",
|
|
153
|
+
children: [
|
|
154
|
+
/* @__PURE__ */ r(g, { type: "trash", size: 14 }),
|
|
155
|
+
" Remove"
|
|
156
|
+
]
|
|
157
|
+
}
|
|
158
|
+
)
|
|
159
|
+
] })
|
|
160
|
+
] }),
|
|
161
|
+
/* @__PURE__ */ r(
|
|
162
|
+
w,
|
|
163
|
+
{
|
|
164
|
+
storagePath: e.storagePath,
|
|
165
|
+
storageId: e.storageId,
|
|
166
|
+
deviceId: k,
|
|
167
|
+
disabled: p,
|
|
168
|
+
onUpdate: (a) => {
|
|
169
|
+
if (a.storage.id === C && a.path === D) {
|
|
170
|
+
A.error("Cannot replicate to the same storage as the primary backup.");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
X(t, {
|
|
174
|
+
replicationId: e.replicationId,
|
|
175
|
+
storageId: a.storage.id,
|
|
176
|
+
storagePath: a.path,
|
|
177
|
+
storageType: a.storage.type,
|
|
178
|
+
storageName: a.storage.name,
|
|
179
|
+
addedAt: e.addedAt
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
)
|
|
184
|
+
] }, e.addedAt || t)),
|
|
185
|
+
p && d.map((e, t) => /* @__PURE__ */ s("div", { className: n.mirrorDestination, children: [
|
|
186
|
+
/* @__PURE__ */ s("div", { className: n.mirrorHeader, children: [
|
|
187
|
+
/* @__PURE__ */ s("label", { className: f.label, children: [
|
|
188
|
+
"Replication Destination ",
|
|
189
|
+
o.storages.length + t + 1
|
|
190
|
+
] }),
|
|
191
|
+
/* @__PURE__ */ s("div", { className: n.mirrorHeaderRight, children: [
|
|
192
|
+
/* @__PURE__ */ s(
|
|
193
|
+
"button",
|
|
194
|
+
{
|
|
195
|
+
className: n.confirmBtn,
|
|
196
|
+
onClick: () => E(t),
|
|
197
|
+
disabled: !e.storageId,
|
|
198
|
+
title: e.storageId ? "Confirm replication destination" : "Select Storage Type to add the storage",
|
|
199
|
+
children: [
|
|
200
|
+
/* @__PURE__ */ r(g, { type: "check", size: 11 }),
|
|
201
|
+
" Confirm"
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
),
|
|
205
|
+
/* @__PURE__ */ s(
|
|
206
|
+
"button",
|
|
207
|
+
{
|
|
208
|
+
className: n.removeBtn,
|
|
209
|
+
onClick: () => L(t),
|
|
210
|
+
title: "Remove replication destination",
|
|
211
|
+
children: [
|
|
212
|
+
/* @__PURE__ */ r(g, { type: "trash", size: 14 }),
|
|
213
|
+
" Remove"
|
|
214
|
+
]
|
|
215
|
+
}
|
|
216
|
+
)
|
|
217
|
+
] })
|
|
218
|
+
] }),
|
|
219
|
+
/* @__PURE__ */ r(
|
|
220
|
+
w,
|
|
221
|
+
{
|
|
222
|
+
storagePath: e.storagePath,
|
|
223
|
+
storageId: e.storageId,
|
|
224
|
+
deviceId: k,
|
|
225
|
+
disabled: !1,
|
|
226
|
+
onUpdate: (a) => {
|
|
227
|
+
O(t, {
|
|
228
|
+
replicationId: e.replicationId,
|
|
229
|
+
storageId: a.storage.id,
|
|
230
|
+
storagePath: a.path,
|
|
231
|
+
storageType: a.storage.type,
|
|
232
|
+
storageName: a.storage.name,
|
|
233
|
+
addedAt: e.addedAt
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
)
|
|
238
|
+
] }, e.addedAt)),
|
|
239
|
+
o.storages.length + (p ? d.length : 0) < (v ?? P) && /* @__PURE__ */ s("button", { className: n.addMirrorBtn, onClick: V, children: [
|
|
240
|
+
/* @__PURE__ */ r(g, { type: "plus", size: 12 }),
|
|
241
|
+
" + Add Replication Destination"
|
|
242
|
+
] }),
|
|
243
|
+
o.storages.length > 1 && /* @__PURE__ */ r("div", { className: n.concurrentOption, children: /* @__PURE__ */ r(
|
|
244
|
+
N,
|
|
245
|
+
{
|
|
246
|
+
label: "Run replications concurrently",
|
|
247
|
+
description: "Run replications in parallel to speed up the backup process",
|
|
248
|
+
fieldValue: o.concurrent,
|
|
249
|
+
onUpdate: j
|
|
250
|
+
}
|
|
251
|
+
) })
|
|
252
|
+
] })
|
|
253
|
+
] }),
|
|
254
|
+
R && /* @__PURE__ */ r(
|
|
255
|
+
K,
|
|
256
|
+
{
|
|
257
|
+
title: "Remove Replication Storage",
|
|
258
|
+
message: /* @__PURE__ */ s("div", { children: [
|
|
259
|
+
/* @__PURE__ */ r("p", { children: "Are you sure you want to remove this Replication storage from this plan?" }),
|
|
260
|
+
/* @__PURE__ */ r(
|
|
261
|
+
N,
|
|
262
|
+
{
|
|
263
|
+
fieldValue: T,
|
|
264
|
+
onUpdate: () => u((e) => !e),
|
|
265
|
+
description: "Remove replicated data from the Storage",
|
|
266
|
+
customClasses: f.removeRemoteToggle
|
|
267
|
+
}
|
|
268
|
+
)
|
|
269
|
+
] }),
|
|
270
|
+
closeModal: () => {
|
|
271
|
+
c.isPending || (b(!1), u(!1), c.reset());
|
|
272
|
+
},
|
|
273
|
+
width: "400px",
|
|
274
|
+
errorMessage: c.isError && "Error Removing Replication Storage!",
|
|
275
|
+
successMessage: c.isSuccess && "Removed Replication Storage Successfully!",
|
|
276
|
+
primaryAction: {
|
|
277
|
+
title: "Yes, Remove Storage",
|
|
278
|
+
type: "danger",
|
|
279
|
+
icon: "trash",
|
|
280
|
+
isPending: c.isPending,
|
|
281
|
+
action: () => q()
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
)
|
|
285
|
+
] });
|
|
286
|
+
};
|
|
287
|
+
export {
|
|
288
|
+
ne as default
|
|
289
|
+
};
|
|
290
|
+
//# sourceMappingURL=PlanReplicationSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanReplicationSettings.js","sources":["../../../../src/components/Plan/PlanSettings/PlanReplicationSettings.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\r\nimport { PlanReplicationSettings as ReplicationSettings, PlanReplicationStorage } from '../../../@types/plans';\r\nimport Icon from '../../common/Icon/Icon';\r\nimport StoragePicker from '../../common/form/StoragePicker/StoragePicker';\r\nimport Toggle from '../../common/form/Toggle/Toggle';\r\nimport classes from '../../Plan/AddPlan/AddPlan.module.scss';\r\nimport mirrorClasses from './PlanReplicationSettings.module.scss';\r\nimport ActionModal from '../../common/ActionModal/ActionModal';\r\nimport { useDeleteReplicationStorage } from '../../../services';\r\nimport { toast } from 'react-toastify';\r\nimport { nanoid } from 'nanoid';\r\n\r\ninterface PlanReplicationSettingsProps {\r\n replication?: ReplicationSettings;\r\n primaryStorageId: string;\r\n primaryStoragePath?: string;\r\n deviceId: string;\r\n isEditing?: boolean;\r\n planID?: string;\r\n maxReplications?: number;\r\n onUpdate: (replication: ReplicationSettings) => void;\r\n}\r\n\r\nconst defaultReplication: ReplicationSettings = {\r\n enabled: false,\r\n concurrent: false,\r\n storages: [],\r\n};\r\n\r\nconst MAX_REPLICATIONS = 2;\r\n\r\nconst PlanReplicationSettings = ({\r\n replication,\r\n primaryStorageId,\r\n primaryStoragePath,\r\n deviceId,\r\n isEditing = false,\r\n planID,\r\n maxReplications: maxReplicationsProp,\r\n onUpdate,\r\n}: PlanReplicationSettingsProps) => {\r\n const [tempStorages, setTempStorages] = useState<PlanReplicationStorage[]>([]);\r\n const [removeStorageData, setRemoveStorageData] = useState<boolean>(false);\r\n const [showRemoveModal, setShowRemoveModal] = useState<boolean | PlanReplicationStorage>(false);\r\n\r\n const deleteStorageMutation = useDeleteReplicationStorage();\r\n const settings = replication || defaultReplication;\r\n\r\n /** Check if a storage+path combination already exists in committed or temp storages */\r\n const isDuplicateStorage = useCallback(\r\n (storageId: string, storagePath: string, excludeCommittedIndex?: number, excludeTempIndex?: number) => {\r\n // Skip duplicate check if storageId or storagePath is empty (incomplete selection)\r\n if (!storageId || !storagePath) return false;\r\n const committedDuplicate = settings.storages.some(\r\n (s, i) =>\r\n (excludeCommittedIndex === undefined || i !== excludeCommittedIndex) && s.storageId === storageId && s.storagePath === storagePath,\r\n );\r\n const tempDuplicate = tempStorages.some(\r\n (s, i) => (excludeTempIndex === undefined || i !== excludeTempIndex) && s.storageId === storageId && s.storagePath === storagePath,\r\n );\r\n return committedDuplicate || tempDuplicate;\r\n },\r\n [settings.storages, tempStorages],\r\n );\r\n\r\n const updateEnabled = (enabled: boolean) => {\r\n onUpdate({ ...settings, enabled });\r\n };\r\n\r\n const updateConcurrent = (concurrent: boolean) => {\r\n onUpdate({ ...settings, concurrent });\r\n };\r\n\r\n const addReplicationStorage = () => {\r\n if (isEditing) {\r\n const maxReplications = maxReplicationsProp ?? MAX_REPLICATIONS;\r\n if (settings.storages.length + tempStorages.length >= maxReplications) return;\r\n setTempStorages([...tempStorages, { replicationId: nanoid(), storageId: '', storagePath: '', storageType: '', addedAt: Date.now() }]);\r\n } else {\r\n const maxReplications = maxReplicationsProp ?? MAX_REPLICATIONS;\r\n if (settings.storages.length >= maxReplications) return;\r\n onUpdate({\r\n ...settings,\r\n storages: [...settings.storages, { replicationId: nanoid(), storageId: '', storagePath: '', storageType: '', addedAt: Date.now() }],\r\n });\r\n }\r\n };\r\n\r\n const updateTempStorage = (index: number, storage: PlanReplicationStorage) => {\r\n setTempStorages((prev) => {\r\n const updated = [...prev];\r\n updated[index] = storage;\r\n return updated;\r\n });\r\n };\r\n\r\n const confirmAddStorage = (index: number) => {\r\n const storage = tempStorages[index];\r\n if (!storage.storageId) return;\r\n if (storage.storageId === primaryStorageId && storage.storagePath === primaryStoragePath) {\r\n toast.error('Cannot replicate to the same storage as the primary backup.');\r\n return;\r\n }\r\n if (isDuplicateStorage(storage.storageId, storage.storagePath, undefined, index)) {\r\n toast.error('This storage destination is already added.');\r\n return;\r\n }\r\n setTempStorages((prev) => prev.filter((_, i) => i !== index));\r\n onUpdate({ ...settings, storages: [...settings.storages, storage] });\r\n };\r\n\r\n const removeTempStorage = (index: number) => {\r\n setTempStorages((prev) => prev.filter((_, i) => i !== index));\r\n };\r\n\r\n const updateReplicationStorage = (index: number, storage: PlanReplicationStorage) => {\r\n const updated = [...settings.storages];\r\n updated[index] = storage;\r\n onUpdate({ ...settings, storages: updated });\r\n };\r\n\r\n const removeAddedStorage = (index: number) => {\r\n const updated = settings.storages.filter((_, i) => i !== index);\r\n onUpdate({ ...settings, storages: updated });\r\n };\r\n\r\n const removeReplicationStorage = () => {\r\n if (typeof showRemoveModal === 'object' && planID) {\r\n const storageToRemove = showRemoveModal;\r\n deleteStorageMutation.mutate(\r\n {\r\n planID: planID,\r\n storageID: storageToRemove.storageId,\r\n removeData: removeStorageData,\r\n storagePath: storageToRemove.storagePath,\r\n replicationId: storageToRemove.replicationId,\r\n },\r\n {\r\n onSuccess: () => {\r\n // Remove the storage from local state and close modal\r\n const updated = settings.storages.filter((s) => s.replicationId !== storageToRemove.replicationId);\r\n onUpdate({ ...settings, storages: updated, ...(updated.length === 0 && { enabled: false }) });\r\n setShowRemoveModal(false);\r\n setRemoveStorageData(false);\r\n deleteStorageMutation.reset();\r\n },\r\n },\r\n );\r\n }\r\n };\r\n\r\n const openRemoveModal = (mirror: PlanReplicationStorage) => {\r\n setRemoveStorageData(false);\r\n deleteStorageMutation.reset();\r\n setShowRemoveModal(mirror);\r\n };\r\n\r\n return (\r\n <div className={classes.field}>\r\n <div className={mirrorClasses.mirrorSection}>\r\n <Toggle\r\n label=\"Enable Replication\"\r\n description=\"Replicate backups to additional storage destinations for redundancy (3-2-1 backup strategy)\"\r\n fieldValue={settings.enabled}\r\n onUpdate={updateEnabled}\r\n />\r\n\r\n {settings.enabled && (\r\n <div className={mirrorClasses.mirrorSettings}>\r\n {settings.storages.map((mirror, index) => (\r\n <div key={mirror.addedAt || index} className={mirrorClasses.mirrorDestination}>\r\n <div className={mirrorClasses.mirrorHeader}>\r\n <label className={classes.label}>Replication Destination {index + 1}</label>\r\n <div className={mirrorClasses.mirrorHeaderRight}>\r\n {settings.storages.length > 1 && (\r\n <div className={mirrorClasses.storagePositionControls}>\r\n <button\r\n title=\"Move Up\"\r\n disabled={index === 0}\r\n onClick={() => {\r\n const updatedStorages = [...(settings.storages || [])];\r\n const [movedStorage] = updatedStorages.splice(index, 1);\r\n updatedStorages.splice(index - 1, 0, movedStorage);\r\n onUpdate({ ...settings, storages: updatedStorages });\r\n }}\r\n >\r\n <Icon type={'caret-up'} size={14} />\r\n </button>\r\n <button\r\n title=\"Move Down\"\r\n disabled={index === settings.storages.length - 1}\r\n onClick={() => {\r\n const updatedStorages = [...(settings.storages || [])];\r\n const [movedStorage] = updatedStorages.splice(index, 1);\r\n updatedStorages.splice(index + 1, 0, movedStorage);\r\n onUpdate({ ...settings, storages: updatedStorages });\r\n }}\r\n >\r\n <Icon type={'caret-down'} size={14} />\r\n </button>\r\n </div>\r\n )}\r\n <button\r\n className={mirrorClasses.removeBtn}\r\n onClick={() => (isEditing ? openRemoveModal(mirror) : removeAddedStorage(index))}\r\n title=\"Remove replication destination\"\r\n >\r\n <Icon type=\"trash\" size={14} /> Remove\r\n </button>\r\n </div>\r\n </div>\r\n <StoragePicker\r\n storagePath={mirror.storagePath}\r\n storageId={mirror.storageId}\r\n deviceId={deviceId}\r\n disabled={isEditing}\r\n onUpdate={(s) => {\r\n if (s.storage.id === primaryStorageId && s.path === primaryStoragePath) {\r\n toast.error('Cannot replicate to the same storage as the primary backup.');\r\n return;\r\n }\r\n updateReplicationStorage(index, {\r\n replicationId: mirror.replicationId,\r\n storageId: s.storage.id,\r\n storagePath: s.path,\r\n storageType: s.storage.type,\r\n storageName: s.storage.name,\r\n addedAt: mirror.addedAt,\r\n });\r\n }}\r\n />\r\n </div>\r\n ))}\r\n\r\n {isEditing &&\r\n tempStorages.map((tempStorage, index) => (\r\n <div key={tempStorage.addedAt} className={mirrorClasses.mirrorDestination}>\r\n <div className={mirrorClasses.mirrorHeader}>\r\n <label className={classes.label}>Replication Destination {settings.storages.length + index + 1}</label>\r\n <div className={mirrorClasses.mirrorHeaderRight}>\r\n <button\r\n className={mirrorClasses.confirmBtn}\r\n onClick={() => confirmAddStorage(index)}\r\n disabled={!tempStorage.storageId}\r\n title={!tempStorage.storageId ? 'Select Storage Type to add the storage' : 'Confirm replication destination'}\r\n >\r\n <Icon type=\"check\" size={11} /> Confirm\r\n </button>\r\n <button\r\n className={mirrorClasses.removeBtn}\r\n onClick={() => removeTempStorage(index)}\r\n title=\"Remove replication destination\"\r\n >\r\n <Icon type=\"trash\" size={14} /> Remove\r\n </button>\r\n </div>\r\n </div>\r\n <StoragePicker\r\n storagePath={tempStorage.storagePath}\r\n storageId={tempStorage.storageId}\r\n deviceId={deviceId}\r\n disabled={false}\r\n onUpdate={(s) => {\r\n updateTempStorage(index, {\r\n replicationId: tempStorage.replicationId,\r\n storageId: s.storage.id,\r\n storagePath: s.path,\r\n storageType: s.storage.type,\r\n storageName: s.storage.name,\r\n addedAt: tempStorage.addedAt,\r\n });\r\n }}\r\n />\r\n </div>\r\n ))}\r\n\r\n {settings.storages.length + (isEditing ? tempStorages.length : 0) < (maxReplicationsProp ?? MAX_REPLICATIONS) && (\r\n <button className={mirrorClasses.addMirrorBtn} onClick={addReplicationStorage}>\r\n <Icon type=\"plus\" size={12} /> + Add Replication Destination\r\n </button>\r\n )}\r\n\r\n {settings.storages.length > 1 && (\r\n <div className={mirrorClasses.concurrentOption}>\r\n <Toggle\r\n label=\"Run replications concurrently\"\r\n description=\"Run replications in parallel to speed up the backup process\"\r\n fieldValue={settings.concurrent}\r\n onUpdate={updateConcurrent}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {showRemoveModal && (\r\n <ActionModal\r\n title=\"Remove Replication Storage\"\r\n message={\r\n <div>\r\n <p>Are you sure you want to remove this Replication storage from this plan?</p>\r\n <Toggle\r\n fieldValue={removeStorageData}\r\n onUpdate={() => setRemoveStorageData((prev) => !prev)}\r\n description={`Remove replicated data from the Storage`}\r\n customClasses={classes.removeRemoteToggle}\r\n />\r\n </div>\r\n }\r\n closeModal={() => {\r\n if (!deleteStorageMutation.isPending) {\r\n setShowRemoveModal(false);\r\n setRemoveStorageData(false);\r\n deleteStorageMutation.reset();\r\n }\r\n }}\r\n width=\"400px\"\r\n errorMessage={deleteStorageMutation.isError && 'Error Removing Replication Storage!'}\r\n successMessage={deleteStorageMutation.isSuccess && 'Removed Replication Storage Successfully!'}\r\n primaryAction={{\r\n title: 'Yes, Remove Storage',\r\n type: 'danger',\r\n icon: 'trash',\r\n isPending: deleteStorageMutation.isPending,\r\n action: () => removeReplicationStorage(),\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanReplicationSettings;\r\n"],"names":["defaultReplication","MAX_REPLICATIONS","PlanReplicationSettings","replication","primaryStorageId","primaryStoragePath","deviceId","isEditing","planID","maxReplicationsProp","onUpdate","tempStorages","setTempStorages","useState","removeStorageData","setRemoveStorageData","showRemoveModal","setShowRemoveModal","deleteStorageMutation","useDeleteReplicationStorage","settings","isDuplicateStorage","useCallback","storageId","storagePath","excludeCommittedIndex","excludeTempIndex","committedDuplicate","s","i","tempDuplicate","updateEnabled","enabled","updateConcurrent","concurrent","addReplicationStorage","maxReplications","nanoid","updateTempStorage","index","storage","prev","updated","confirmAddStorage","toast","_","removeTempStorage","updateReplicationStorage","removeAddedStorage","removeReplicationStorage","storageToRemove","openRemoveModal","mirror","jsxs","classes","mirrorClasses","jsx","Toggle","updatedStorages","movedStorage","Icon","StoragePicker","tempStorage","ActionModal"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const r = "_mirrorSection_Efsq1", o = "_mirrorSettings_AJKTW", t = "_mirrorDestination_3RA9j", n = "_mirrorHeader_aDDut", i = "_mirrorHeaderRight_p0Kdg", e = "_confirmBtn_TAGXU", s = "_removeBtn_Bx8Qq", c = "_storagePositionControls_fUF7P", m = "_addMirrorBtn_VVs1x", _ = "_concurrentOption_CHkh6", a = {
|
|
2
|
+
mirrorSection: r,
|
|
3
|
+
mirrorSettings: o,
|
|
4
|
+
mirrorDestination: t,
|
|
5
|
+
mirrorHeader: n,
|
|
6
|
+
mirrorHeaderRight: i,
|
|
7
|
+
confirmBtn: e,
|
|
8
|
+
removeBtn: s,
|
|
9
|
+
storagePositionControls: c,
|
|
10
|
+
addMirrorBtn: m,
|
|
11
|
+
concurrentOption: _
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
m as addMirrorBtn,
|
|
15
|
+
_ as concurrentOption,
|
|
16
|
+
e as confirmBtn,
|
|
17
|
+
a as default,
|
|
18
|
+
t as mirrorDestination,
|
|
19
|
+
n as mirrorHeader,
|
|
20
|
+
i as mirrorHeaderRight,
|
|
21
|
+
r as mirrorSection,
|
|
22
|
+
o as mirrorSettings,
|
|
23
|
+
s as removeBtn,
|
|
24
|
+
c as storagePositionControls
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=PlanReplicationSettings.module.scss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanReplicationSettings.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanStats.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanStats/PlanStats.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"PlanStats.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanStats/PlanStats.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAM7C,UAAU,cAAc;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,GAAG,CAAC;CACtB;AAED,QAAA,MAAM,SAAS,GAAI,kCAAkC,cAAc,4CAgFlE,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -1,25 +1,26 @@
|
|
|
1
|
-
import { jsxs as i, jsx as
|
|
1
|
+
import { jsxs as i, jsx as e } from "react/jsx-runtime";
|
|
2
2
|
import a from "../../common/Icon/Icon.js";
|
|
3
|
-
import { formatNumberToK as
|
|
3
|
+
import { formatNumberToK as u, formatBytes as T } from "../../../utils/helpers.js";
|
|
4
4
|
import S from "../PlanHistory/PlanHistory.js";
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
import t from "./PlanStats.module.scss.js";
|
|
6
|
+
import z from "../PlanStorageInfo/PlanStorageInfo.js";
|
|
7
|
+
const C = ({ plan: d, isSync: c, lastBackupItem: s }) => {
|
|
8
|
+
const { sourceConfig: r, storage: g, storagePath: y, isActive: p, settings: f } = d, { interval: n } = f, m = (s == null ? void 0 : s.totalFiles) || 0, v = (s == null ? void 0 : s.totalSize) || 0, N = (l) => {
|
|
9
|
+
let o = "";
|
|
10
|
+
return l && l.includes && l.includes.length > 0 && (o += "<div><strong>Includes</strong></div>", o += l.includes.map((h) => `<div>${d.device.name} -> ${h}</div>`).join("")), l && l.excludes && l.excludes.length > 0 && (o += "<div><strong>Excludes</strong></div>", o += l.excludes.map((h) => `<div>${h}</div>`).join("")), o;
|
|
10
11
|
};
|
|
11
|
-
return /* @__PURE__ */ i("div", { className:
|
|
12
|
-
/* @__PURE__ */ i("div", { className:
|
|
13
|
-
/* @__PURE__ */ i("div", { className:
|
|
14
|
-
/* @__PURE__ */
|
|
12
|
+
return /* @__PURE__ */ i("div", { className: t.planStats, children: [
|
|
13
|
+
/* @__PURE__ */ i("div", { className: t.sources, children: [
|
|
14
|
+
/* @__PURE__ */ i("div", { className: t.widgetTitle, children: [
|
|
15
|
+
/* @__PURE__ */ e(a, { type: "backup", size: 12 }),
|
|
15
16
|
" ",
|
|
16
|
-
|
|
17
|
+
c ? "Syncing" : "Backing Up"
|
|
17
18
|
] }),
|
|
18
|
-
/* @__PURE__ */ i("div", { className:
|
|
19
|
-
/* @__PURE__ */ i("div", { "data-tooltip-id": "htmlToolTip", "data-tooltip-place": "top", "data-tooltip-html":
|
|
20
|
-
/* @__PURE__ */
|
|
19
|
+
/* @__PURE__ */ i("div", { className: t.sourceContent, children: [
|
|
20
|
+
/* @__PURE__ */ i("div", { "data-tooltip-id": "htmlToolTip", "data-tooltip-place": "top", "data-tooltip-html": N(r), children: [
|
|
21
|
+
/* @__PURE__ */ e(a, { type: "folders", size: 18 }),
|
|
21
22
|
/* @__PURE__ */ i("span", { children: [
|
|
22
|
-
|
|
23
|
+
r == null ? void 0 : r.includes.length,
|
|
23
24
|
" Sources"
|
|
24
25
|
] })
|
|
25
26
|
] }),
|
|
@@ -28,54 +29,52 @@ const w = ({ plan: r, isSync: h, lastBackupItem: n }) => {
|
|
|
28
29
|
{
|
|
29
30
|
"data-tooltip-id": "htmlToolTip",
|
|
30
31
|
"data-tooltip-place": "top",
|
|
31
|
-
"data-tooltip-html":
|
|
32
|
+
"data-tooltip-html": p ? c ? `Syncing changes every ${n.minutes} minutes` : `Copying changes ${["hours", "minutes", "days"].includes(n.type) ? n[n.type] + n.type : n.type}` : "Plan is Not Active",
|
|
32
33
|
children: [
|
|
33
|
-
/* @__PURE__ */
|
|
34
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ e(a, { type: p ? c ? "reload" : "copy" : "pause", size: 16 }),
|
|
35
|
+
/* @__PURE__ */ e("div", { className: t.sourceArrow, children: "→" })
|
|
35
36
|
]
|
|
36
37
|
}
|
|
37
38
|
),
|
|
38
|
-
/* @__PURE__ */
|
|
39
|
-
|
|
39
|
+
/* @__PURE__ */ e(
|
|
40
|
+
z,
|
|
40
41
|
{
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
e == null ? void 0 : e.name
|
|
47
|
-
]
|
|
42
|
+
disableTooltip: !1,
|
|
43
|
+
inline: !1,
|
|
44
|
+
replicationSettings: d.settings.replication,
|
|
45
|
+
storage: g,
|
|
46
|
+
storagePath: y
|
|
48
47
|
}
|
|
49
48
|
)
|
|
50
49
|
] })
|
|
51
50
|
] }),
|
|
52
|
-
/* @__PURE__ */ i("div", { className:
|
|
53
|
-
/* @__PURE__ */ i("div", { className:
|
|
54
|
-
/* @__PURE__ */
|
|
51
|
+
/* @__PURE__ */ i("div", { className: t.snapshots, children: [
|
|
52
|
+
/* @__PURE__ */ i("div", { className: t.widgetTitle, children: [
|
|
53
|
+
/* @__PURE__ */ e(a, { type: "folders", size: 12 }),
|
|
55
54
|
" Source Stats"
|
|
56
55
|
] }),
|
|
57
|
-
/* @__PURE__ */ i("div", { className:
|
|
56
|
+
/* @__PURE__ */ i("div", { className: t.snapshotsContent, children: [
|
|
58
57
|
/* @__PURE__ */ i("div", { children: [
|
|
59
|
-
/* @__PURE__ */
|
|
60
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ e("span", { children: m ? u(m) : 0 }),
|
|
59
|
+
/* @__PURE__ */ e("span", { children: "Files" })
|
|
61
60
|
] }),
|
|
62
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ e("div", {}),
|
|
63
62
|
/* @__PURE__ */ i("div", { children: [
|
|
64
|
-
/* @__PURE__ */
|
|
65
|
-
/* @__PURE__ */
|
|
63
|
+
/* @__PURE__ */ e("span", { children: v ? T(v) : "0.00B" }),
|
|
64
|
+
/* @__PURE__ */ e("span", { children: "Size" })
|
|
66
65
|
] })
|
|
67
66
|
] })
|
|
68
67
|
] }),
|
|
69
|
-
/* @__PURE__ */ i("div", { className:
|
|
70
|
-
/* @__PURE__ */ i("div", { className:
|
|
71
|
-
/* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ i("div", { className: t.health, children: [
|
|
69
|
+
/* @__PURE__ */ i("div", { className: t.widgetTitle, children: [
|
|
70
|
+
/* @__PURE__ */ e(a, { type: "speed", size: 12 }),
|
|
72
71
|
" Health"
|
|
73
72
|
] }),
|
|
74
|
-
/* @__PURE__ */
|
|
73
|
+
/* @__PURE__ */ e("div", { className: t.healthContent, children: /* @__PURE__ */ e(S, { planId: d.id, history: d.backups, itemsCount: 90 }) })
|
|
75
74
|
] })
|
|
76
75
|
] });
|
|
77
76
|
};
|
|
78
77
|
export {
|
|
79
|
-
|
|
78
|
+
C as default
|
|
80
79
|
};
|
|
81
80
|
//# sourceMappingURL=PlanStats.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanStats.js","sources":["../../../../src/components/Plan/PlanStats/PlanStats.tsx"],"sourcesContent":["import Icon from '../../common/Icon/Icon';\r\nimport { Plan } from '../../../@types/plans';\r\nimport { formatBytes, formatNumberToK } from '../../../utils/helpers';\r\nimport PlanHistory from '../PlanHistory/PlanHistory';\r\nimport classes from './PlanStats.module.scss';\r\n\r\ninterface PlanStatsProps {\r\n plan: Plan;\r\n isSync: boolean;\r\n lastBackupItem: any;\r\n}\r\n\r\nconst PlanStats = ({ plan, isSync, lastBackupItem }: PlanStatsProps) => {\r\n const { sourceConfig, storage, storagePath, isActive, settings } = plan;\r\n const { interval } = settings;\r\n\r\n const totalFiles = lastBackupItem?.totalFiles || 0;\r\n const totalSize = lastBackupItem?.totalSize || 0;\r\n\r\n const sourceTooltipHTML = (sources: Plan['sourceConfig']) => {\r\n let html = '';\r\n if (sources && sources.includes && sources.includes.length > 0) {\r\n html += `<div><strong>Includes</strong></div>`;\r\n html += sources.includes.map((p) => `<div>${plan.device.name} -> ${p}</div>`).join('');\r\n }\r\n if (sources && sources.excludes && sources.excludes.length > 0) {\r\n html += `<div><strong>Excludes</strong></div>`;\r\n html += sources.excludes.map((p) => `<div>${p}</div>`).join('');\r\n }\r\n return html;\r\n };\r\n\r\n return (\r\n <div className={classes.planStats}>\r\n <div className={classes.sources}>\r\n <div className={classes.widgetTitle}>\r\n <Icon type=\"backup\" size={12} /> {isSync ? 'Syncing' : 'Backing Up'}\r\n </div>\r\n <div className={classes.sourceContent}>\r\n <div data-tooltip-id=\"htmlToolTip\" data-tooltip-place=\"top\" data-tooltip-html={sourceTooltipHTML(sourceConfig)}>\r\n <Icon type=\"folders\" size={18} />\r\n <span>{sourceConfig?.includes.length} Sources</span>\r\n </div>\r\n <div\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-html={\r\n isActive\r\n ? isSync\r\n ? `Syncing changes every ${interval.minutes} minutes`\r\n : `Copying changes ${['hours', 'minutes', 'days'].includes(interval.type) ? interval[interval.type as 'hours' | 'minutes' | 'days'] + interval.type : interval.type}`\r\n : 'Plan is Not Active'\r\n }\r\n >\r\n <Icon type={isActive ? (isSync ? 'reload' : 'copy') : 'pause'} size={16} />\r\n <div className={classes.sourceArrow}>→</div>\r\n </div>\r\n <
|
|
1
|
+
{"version":3,"file":"PlanStats.js","sources":["../../../../src/components/Plan/PlanStats/PlanStats.tsx"],"sourcesContent":["import Icon from '../../common/Icon/Icon';\r\nimport { Plan } from '../../../@types/plans';\r\nimport { formatBytes, formatNumberToK } from '../../../utils/helpers';\r\nimport PlanHistory from '../PlanHistory/PlanHistory';\r\nimport classes from './PlanStats.module.scss';\r\nimport PlanStorageInfo from '../PlanStorageInfo/PlanStorageInfo';\r\n\r\ninterface PlanStatsProps {\r\n plan: Plan;\r\n isSync: boolean;\r\n lastBackupItem: any;\r\n}\r\n\r\nconst PlanStats = ({ plan, isSync, lastBackupItem }: PlanStatsProps) => {\r\n const { sourceConfig, storage, storagePath, isActive, settings } = plan;\r\n const { interval } = settings;\r\n\r\n const totalFiles = lastBackupItem?.totalFiles || 0;\r\n const totalSize = lastBackupItem?.totalSize || 0;\r\n\r\n const sourceTooltipHTML = (sources: Plan['sourceConfig']) => {\r\n let html = '';\r\n if (sources && sources.includes && sources.includes.length > 0) {\r\n html += `<div><strong>Includes</strong></div>`;\r\n html += sources.includes.map((p) => `<div>${plan.device.name} -> ${p}</div>`).join('');\r\n }\r\n if (sources && sources.excludes && sources.excludes.length > 0) {\r\n html += `<div><strong>Excludes</strong></div>`;\r\n html += sources.excludes.map((p) => `<div>${p}</div>`).join('');\r\n }\r\n return html;\r\n };\r\n\r\n return (\r\n <div className={classes.planStats}>\r\n <div className={classes.sources}>\r\n <div className={classes.widgetTitle}>\r\n <Icon type=\"backup\" size={12} /> {isSync ? 'Syncing' : 'Backing Up'}\r\n </div>\r\n <div className={classes.sourceContent}>\r\n <div data-tooltip-id=\"htmlToolTip\" data-tooltip-place=\"top\" data-tooltip-html={sourceTooltipHTML(sourceConfig)}>\r\n <Icon type=\"folders\" size={18} />\r\n <span>{sourceConfig?.includes.length} Sources</span>\r\n </div>\r\n <div\r\n data-tooltip-id=\"htmlToolTip\"\r\n data-tooltip-place=\"top\"\r\n data-tooltip-html={\r\n isActive\r\n ? isSync\r\n ? `Syncing changes every ${interval.minutes} minutes`\r\n : `Copying changes ${['hours', 'minutes', 'days'].includes(interval.type) ? interval[interval.type as 'hours' | 'minutes' | 'days'] + interval.type : interval.type}`\r\n : 'Plan is Not Active'\r\n }\r\n >\r\n <Icon type={isActive ? (isSync ? 'reload' : 'copy') : 'pause'} size={16} />\r\n <div className={classes.sourceArrow}>→</div>\r\n </div>\r\n <PlanStorageInfo\r\n disableTooltip={false}\r\n inline={false}\r\n replicationSettings={plan.settings.replication}\r\n storage={storage}\r\n storagePath={storagePath}\r\n />\r\n </div>\r\n </div>\r\n <div className={classes.snapshots}>\r\n <div className={classes.widgetTitle}>\r\n <Icon type=\"folders\" size={12} /> Source Stats\r\n </div>\r\n <div className={classes.snapshotsContent}>\r\n <div>\r\n <span>{totalFiles ? formatNumberToK(totalFiles) : 0}</span>\r\n <span>Files</span>\r\n </div>\r\n <div></div>\r\n <div>\r\n <span>{totalSize ? formatBytes(totalSize) : '0.00B'}</span>\r\n <span>Size</span>\r\n </div>\r\n </div>\r\n </div>\r\n <div className={classes.health}>\r\n <div className={classes.widgetTitle}>\r\n <Icon type=\"speed\" size={12} /> Health\r\n </div>\r\n <div className={classes.healthContent}>\r\n <PlanHistory planId={plan.id} history={plan.backups} itemsCount={90} />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default PlanStats;\r\n"],"names":["PlanStats","plan","isSync","lastBackupItem","sourceConfig","storage","storagePath","isActive","settings","interval","totalFiles","totalSize","sourceTooltipHTML","sources","html","p","jsxs","classes","jsx","Icon","PlanStorageInfo","formatNumberToK","formatBytes","PlanHistory"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
const s = "
|
|
1
|
+
const s = "_planStats_rYcAd", t = "_widgetTitle_PJX4o", o = "_sources_KFvuD", n = "_snapshots_s9ThB", e = "_health_Tux66", c = "_sourceContent_ioGQg", a = "_sourceArrow_VI4d7", r = "_snapshotsContent_ZuAcY", _ = {
|
|
2
2
|
planStats: s,
|
|
3
3
|
widgetTitle: t,
|
|
4
4
|
sources: o,
|
|
5
5
|
snapshots: n,
|
|
6
6
|
health: e,
|
|
7
|
-
sourceContent:
|
|
8
|
-
sourceArrow:
|
|
7
|
+
sourceContent: c,
|
|
8
|
+
sourceArrow: a,
|
|
9
9
|
snapshotsContent: r
|
|
10
10
|
};
|
|
11
11
|
export {
|
|
@@ -14,8 +14,8 @@ export {
|
|
|
14
14
|
s as planStats,
|
|
15
15
|
n as snapshots,
|
|
16
16
|
r as snapshotsContent,
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
a as sourceArrow,
|
|
18
|
+
c as sourceContent,
|
|
19
19
|
o as sources,
|
|
20
20
|
t as widgetTitle
|
|
21
21
|
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PlanReplicationSettings } from '../../../@types';
|
|
2
|
+
interface PlanStorageInfoProps {
|
|
3
|
+
storage: {
|
|
4
|
+
name: string;
|
|
5
|
+
type: string;
|
|
6
|
+
id: string;
|
|
7
|
+
};
|
|
8
|
+
storagePath: string;
|
|
9
|
+
replicationSettings?: PlanReplicationSettings;
|
|
10
|
+
disableTooltip?: boolean;
|
|
11
|
+
inline?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare const PlanStorageInfo: ({ replicationSettings, storage, storagePath, disableTooltip, inline }: PlanStorageInfoProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export default PlanStorageInfo;
|
|
15
|
+
//# sourceMappingURL=PlanStorageInfo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlanStorageInfo.d.ts","sourceRoot":"","sources":["../../../../src/components/Plan/PlanStorageInfo/PlanStorageInfo.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG1D,UAAU,oBAAoB;IAC3B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,QAAA,MAAM,eAAe,GAAI,uEAAqF,oBAAoB,4CAqEjI,CAAC;AAEF,eAAe,eAAe,CAAC"}
|